suin.io

ob_start()後にthrow new Excpetionすると出力バッファが解除される?

suin2011年3月14日

検証1

try
{
	ob_start();
	echo "これは見えちゃだめ!";
	throw new Exception();
}
catch ( Exception $e )
{
}

echo "こっちが先。";

結果1

これは見えちゃだめ!こっちが先。

検証2

try
{
	ob_start();
	echo "これは見えちゃだめ!";
	ob_start();
	echo "これは見えちゃだめだってば!";
	throw new Exception();
}
catch ( Exception $e )
{
}

echo "こっちが先。";

結果2

これは見えちゃだめ!これは見えちゃだめだってば!こっちが先。

検証3

class MyException extends Exception
{
	public function __construct()
	{
		echo "例外のコンストラクタだよ。";
	}
}

try
{
	ob_start();
	echo "これは見えちゃだめ!";
	throw new MyException();
}
catch ( MyException $e )
{
}

echo "こっちが先。";

結果3

これは見えちゃだめ!例外のコンストラクタだよ。こっちが先。

検証4

try
{
	ob_start();
	echo "これは見えちゃだめ!";
	throw new Exception();
}
catch ( Exception $e )
{
	$content = ob_get_clean();
}

echo "こっちが先。";
echo $content;

結果4

こっちが先。これは見えちゃだめ!

まとめ

  • 例外によって出力バッファが解かれるというより、プロセス終了時に開放される模様
  • 例外もキャッチしたときに、ob_get_clean()などを施せば、一応出力バッファを捕獲することはできる。
  • 捕獲はできるけれども、プロジェクトが大規模になってくると捕獲が困難になりそう。何かいい方法ないかな…?
RELATED POSTS