php中这种构造函数/析构函数行为的原因是什么?

php中这种构造函数/析构函数行为的原因是什么?,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

我正在用PHP运行一个简单的构造函数/析构函数程序

为什么输出以这两行开头

创建了狗0
创建狗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