Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
76.47% |
13 / 17 |
|
20.00% |
1 / 5 |
CRAP | |
0.00% |
0 / 1 |
OutputBuffer | |
76.47% |
13 / 17 |
|
20.00% |
1 / 5 |
10.06 | |
0.00% |
0 / 1 |
__construct | |
50.00% |
1 / 2 |
|
0.00% |
0 / 1 |
2.50 | |||
getContents | |
75.00% |
3 / 4 |
|
0.00% |
0 / 1 |
2.06 | |||
getByteCount | |
75.00% |
3 / 4 |
|
0.00% |
0 / 1 |
2.06 | |||
get | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
1 | |||
disposeImpl | |
66.67% |
2 / 3 |
|
0.00% |
0 / 1 |
2.15 |
1 | <?php |
2 | |
3 | declare(strict_types=1); |
4 | |
5 | namespace PeServer\Core; |
6 | |
7 | use PeServer\Core\Binary; |
8 | use PeServer\Core\Throws\OutputBufferException; |
9 | |
10 | /** |
11 | * 出力バッファリング。 |
12 | * |
13 | * 出力バッファリング系を統括してとりあえず出力されるものをまとめる。 |
14 | * このクラスは部分的にあれこれするのではなく一括でどさっと処理する想定。 |
15 | * |
16 | * @see https://www.php.net/manual/function.ob-start.php |
17 | * @see https://www.php.net/manual/function.ob-get-contents.php |
18 | * @see https://www.php.net/manual/function.ob-end-clean.php |
19 | */ |
20 | class OutputBuffer extends DisposerBase |
21 | { |
22 | /** |
23 | * 生成しつつバッファリング開始。 |
24 | * @throws OutputBufferException バッファリング開始失敗。 |
25 | */ |
26 | public function __construct() |
27 | { |
28 | if (!ob_start()) { |
29 | throw new OutputBufferException('ob_start'); |
30 | } |
31 | } |
32 | |
33 | #region function |
34 | |
35 | /** |
36 | * バッファリング中のデータ取得。 |
37 | * |
38 | * データは破棄される。 |
39 | * |
40 | * @return Binary バッファリング中のデータ。 |
41 | * @throws OutputBufferException 取得失敗。 |
42 | */ |
43 | public function getContents(): Binary |
44 | { |
45 | $buffer = ob_get_contents(); |
46 | if ($buffer === false) { |
47 | throw new OutputBufferException('ob_get_contents'); |
48 | } |
49 | |
50 | return new Binary($buffer); |
51 | } |
52 | |
53 | /** |
54 | * バッファリング中のバイト数を取得。 |
55 | * |
56 | * @see https://www.php.net/manual/function.ob-get-length.php |
57 | * @return int バイト数。 |
58 | * @throws OutputBufferException 取得失敗。 |
59 | */ |
60 | public function getByteCount(): int |
61 | { |
62 | $result = ob_get_length(); |
63 | if ($result === false) { |
64 | throw new OutputBufferException('ob_get_length'); |
65 | } |
66 | |
67 | return $result; |
68 | } |
69 | |
70 | /** |
71 | * 引数処理中の出力を取得。 |
72 | * |
73 | * **基本的にこれだけ使ってればいい。** |
74 | * |
75 | * @param callable $action 出力を取得したい処理。 |
76 | * @return Binary 取得した処理。 |
77 | * @throws OutputBufferException なんかあかんかった。 |
78 | */ |
79 | public static function get(callable $action): Binary |
80 | { |
81 | $self = new self(); |
82 | |
83 | try { |
84 | $action(); |
85 | return $self->getContents(); |
86 | } finally { |
87 | $self->dispose(); |
88 | } |
89 | } |
90 | |
91 | #endregion |
92 | |
93 | #region DisposerBase |
94 | |
95 | /** |
96 | * @inheritdoc |
97 | * @throws OutputBufferException クリーンアップ失敗。 |
98 | */ |
99 | protected function disposeImpl(): void |
100 | { |
101 | if (!ob_end_clean()) { |
102 | throw new OutputBufferException('ob_end_clean'); |
103 | } |
104 | |
105 | parent::disposeImpl(); |
106 | } |
107 | |
108 | #endregion |
109 | } |