我正在学习 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 的类层次结构中实现正确的范围展开,以便在发生异常时正确销毁子对象?
此外,似乎没有办法在所有成员对象都被销毁(at )之后#2
运行基本析构函数。也就是说,如果我们删除 line #1
,我们会得到:
Base const.
Foo const.
Der const.
Der destr.
Base destr.
Foo destr. // ouch!!
如何解决这个问题?
更新:我仍然愿意接受进一步的贡献。如果有人有充分的理由说明为什么 PHP 对象系统从不需要正确的销毁序列,我将为此提供另一个赏金(或只是为任何其他令人信服的争论答案)。