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 function __destruct()
    {

        echo "destroyed dog $this->name <br/>";
    }

}

for($i = 0;$i<=2;$i++)
{

    $dog = new dog($i);

}


$dog = new dog("last");

?>

完整输出

created dog 0 
created dog 1 
destroyed dog 0 
created dog 2 
destroyed dog 1 
created dog last 
destroyed dog 2 
destroyed dog last 

最佳答案

从 for 循环的第一次迭代开始。在幕后,内存中分配了一个空间来保存 Dog() 对象。

然后,一个新变量 $dog 被分配为指向 Dog() 在内存中的地址的指针/引用。我们看到第一条创建的消息。

现在我们知道,第一个 Dog() 只有在没有更多引用时才会被销毁。

请记住,第二次循环时,会重复相同的过程。内存中的新空间被分配给 new Dog(),然后该内存的地址再次赋予 $dog。第二次创建消息。

现在原来的狗没有指向它的引用,因此可以将其销毁。首先销毁消息。

按照相同的过程,您应该明白为什么其余消息会这样读出。

关于php - php 中构造函数/析构函数行为的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31252045/

相关文章:

php - Symfony2 表单为什么我的表单返回警告 : json_encode(): recursion detected?

php - Symfony:类型为 "?Doctrine\Common\Collections\Collection"的预期参数,在属性路径中给出 "array"

php - PHP 中的父对象类型提示

php - MySQL/PHP 查询 - 检查输入的开始/结束日期是否与 Db 中的现有日期范围重叠

javascript - 使用 Javascript 和 PHP 读取 JSon 字符串

php - 连接到 MySQL DB 并检索信息

php - 如何连接来自不同数据库的两个表

php - 在Docker容器中运行laravel环境

php - 让 WebSocket 从远程 URL 工作

php - SQL : multiple select count() displayed on same row