PHP に限らず他の言語でも言われていることですが、クラスのコンストラクタで例外を投げるような構造を取らざるを得ない場合、気をつけて置かなければならないことがあります。
例外の発生によってコンストラクタでの処理が中断され、インスタンスが生成されなかった場合、そのクラスのデストラクタは実行されません。
<?php
class Sample
{
function __construct(){
throw new Exception("error");
}
function __destruct(){
echo "destruct";
}
}
try {
$sample = new Sample();
} catch (Exception $e){
echo $e->getMessage();
}
生成に失敗したインスタンス変数は NULL のままになってしまうので、コンストラクタで利用した通信の切断やロックの解除をデストラクタやクラスメソッドから行うことはできなくなります。
コンストラクタ内で例外を投げる場合は、エラー発生時の終了処理を完結させた後でスローしたほうが良さそうです。
