Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
76.47% covered (warning)
76.47%
13 / 17
20.00% covered (danger)
20.00%
1 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
OutputBuffer
76.47% covered (warning)
76.47%
13 / 17
20.00% covered (danger)
20.00%
1 / 5
10.06
0.00% covered (danger)
0.00%
0 / 1
 __construct
50.00% covered (danger)
50.00%
1 / 2
0.00% covered (danger)
0.00%
0 / 1
2.50
 getContents
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 getByteCount
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 get
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 disposeImpl
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
2.15
1<?php
2
3declare(strict_types=1);
4
5namespace PeServer\Core;
6
7use PeServer\Core\Binary;
8use 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 */
20class 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}