php中这种构造函数/析构函数行为的原因是什么?
我正在用PHP运行一个简单的构造函数/析构函数程序 为什么输出以这两行开头 创建了狗0php中这种构造函数/析构函数行为的原因是什么?,php,Php,我正在用PHP运行一个简单的构造函数/析构函数程序 为什么输出以这两行开头 创建了狗0 创建狗1 应该是什么时候 创建了狗0 被摧毁的狗0 <?php class dog{ public $name; public function __construct($name){ $this->name = $name; echo "created dog $name <br/>"; } public fu
创建狗1 应该是什么时候 创建了狗0
被摧毁的狗0
<?php
class dog{
public $name;
public function __construct($name){
$this->name = $name;
echo "created dog $name <br/>";
}
public function __destruct()
{
echo "destroyed dog $this->name <br/>";
}
}
for($i = 0;$i<=2;$i++)
{
$dog = new dog($i);
}
$dog = new dog("last");
?>
从for循环的第一次迭代开始。在幕后,内存中分配了一个空间来存放Dog()对象 然后,一个新变量
$dog
被分配到内存中dog()地址的指针/引用。我们看到了第一条创建的消息
现在我们知道,只有当没有更多的引用时,第一个Dog()才会被销毁
记住,第二次通过循环时,重复相同的过程。内存中的一个新空间被分配给一个新的Dog(),然后该内存的地址再次被分配给$Dog
。第二,创建消息
现在,原来的狗没有指向它的参考,所以它可以被销毁。首先销毁消息
按照同样的过程,您应该看到为什么其余的消息会像它们那样被读取。根据您的解决方案,在最后一个循环中,迭代
销毁的dog 2
应该在创建的dog last
之前发生,因为一旦for循环退出,在循环中创建的对象的所有引用都会被销毁。那么,为什么PHP会将对销毁的dog 2
的调用延迟到创建的dog last
之后呢?当您处于for
循环中时,PHP不会创建新的变量作用域,因此循环中创建的最后一个对象没有理由丢失其引用/被销毁<代码>销毁的dog 2会丢失对dog 2
对象的引用。last
狗的创建和分配(首先触发created dog last
)是导致参考丢失的原因。因此,在检查对狗2
的更多引用之前,创建最后一只狗。这都是关于变量赋值的,与示例代码中的作用域无关。对不起,我没说清楚。
created dog 0
created dog 1
destroyed dog 0
created dog 2
destroyed dog 1
created dog last
destroyed dog 2
destroyed dog last