私は PHP のクラスと例外を学んでいますが、C++ のバックグラウンドを持っているため、次のことは奇妙に思えます。
派生クラスのコンストラクターが例外をスローすると、基本クラスのデストラクターが自動的に実行されないように見えます。
class Base
{
public function __construct() { print("Base const.\n"); }
public function __destruct() { print("Base destr.\n"); }
}
class Der extends Base
{
public function __construct()
{
parent::__construct();
$this->foo = new Foo;
print("Der const.\n");
throw new Exception("foo"); // #1
}
public function __destruct() { print("Der destr.\n"); parent::__destruct(); }
public $foo; // #2
}
class Foo
{
public function __construct() { print("Foo const.\n"); }
public function __destruct() { print("Foo destr.\n"); }
}
try {
$x = new Der;
} catch (Exception $e) {
}
これは以下を出力します:
Base const.
Foo const.
Der const.
Foo destr.
一方、メンバー オブジェクトのデストラクタは、コンストラクタ (at ) に例外がある場合は適切に#1
実行されます。ここで疑問に思うのは、例外が発生した場合にサブオブジェクトが適切に破棄されるように、PHP のクラス階層で正しいスコープの巻き戻しを実装するにはどうすればよいかということです。
また、すべてのメンバー オブジェクトが破棄された後(で) 、基本デストラクタを実行する方法がないよう#2
です。つまり、行を削除すると#1
、次のようになります。
Base const.
Foo const.
Der const.
Der destr.
Base destr.
Foo destr. // ouch!!
その問題をどのように解決しますか?
更新:私はまださらなる貢献を受け付けています。PHPオブジェクトシステムが正しい破棄シーケンスを必要としない理由を誰かが十分に正当化している場合、私はそのために別の報奨金を与えます (または、説得力のある他の答えのために)。