【发布时间】:2012-12-15 07:36:47
【问题描述】:
对象解构的具体顺序是什么?
通过测试,我有一个想法:当前范围的 FIFO。
class test1
{
public function __destruct()
{
echo "test1\n";
}
}
class test2
{
public function __destruct()
{
echo "test2\n";
}
}
$a = new test1();
$b = new test2();
这会一次又一次地产生相同的结果:
test1
test2
PHP manual 含糊不清(强调我的以突出不确定性):“只要没有其他对特定对象的引用或在关闭序列期间以任何顺序调用,就会调用析构函数方法。”
解构的具体顺序是什么?谁能详细描述PHP使用的销毁命令的实现?而且,如果这个顺序在所有 PHP 版本之间不一致,那么任何人都可以查明哪些 PHP 版本在这个顺序中发生了变化?
【问题讨论】:
-
如果文档说它可以是任何顺序,那么即使该顺序在您的所有测试和您关心的所有版本中看起来都是稳定的,也不要假设任何特定的顺序关于。为什么你还需要这个?如果它很重要,您应该明确说明它而不是依赖最终确定。顺便说一句,这适用于任何语言。
-
为什么确切的顺序很重要?如果手册明确指出它是“任意顺序”,则永远不要依赖它。
-
“任何顺序”并不意味着它是随机的,只是不能保证顺序。它仍然可以根据实现细节有一个确定的顺序。
-
在实践中它不是随机的,但您应该像这样编写代码。理解“任意”一词的良好经验法则。
-
您是来自 C 或其他一些低级语言,您已经或完全知道某事发生了什么、何时以及如何发生,可能是因为您必须这样做? PHP 不是那样的。更上一层楼,所以这些低级任务完全在内部以一种我们不知道的方式进行管理,就像 GC 一样。当它发生时它就会发生,它背后的工程有时是……不寻常的。老实说,您可能必须找到一个 PHP 源工程师,或者(就像我正在做的那样)尝试找到一个工具来映射流程并直观地描述它们。真的很难说。
标签: php php-internals