博客
关于我
php对象引用和析构函数的关系
阅读量:793 次
发布时间:2023-03-01

本文共 901 字,大约阅读时间需要 3 分钟。

PHP中的构造函数和析构函数都属于魔术方法。构造函数在类被实例化时自动调用,而析构函数则在对象被销毁时自动调用,默认情况下是在程序结束时执行。这种特性在处理对象生命周期时非常有用。

在对象引用时,析构函数的调用行为会发生变化。如果只引用了一个对象(例如$obj),只要执行$obj = null;,则表示$obj被销毁,此时其析构函数会被提前调用。但其他未被销毁的对象不会受到影响。

需要注意的是,当使用$obj1 = &$obj;(即引用赋值)时,会产生共享内存空间的引用关系。当$obj$obj1中的任何一个被销毁时,另一个也会随之消失。这种引用方式与直接赋值$obj1 = $obj;有显著区别。直接赋值会创建一个新的引用,当其中一个对象被销毁时,另一个仍然可用,直到最后两个对象同时被销毁时,析构函数才会被调用。

而使用$obj1 = clone $obj;则会创建两个独立的对象。$obj1$obj互不影响,各自拥有独立的内存空间。为了更好地控制克隆行为,可以在类中定义__clone()魔术方法,赋予克隆后的对象特定属性或屏蔽不想要的值。例如:

class Player {
public $name;
function __destruct() {
echo "Destroying " . $this->name;
}
function __clone() {
$this->name = "gbcs";
}
}
$james = new Player();
$james2 = clone $james;
echo $james2->name . '
';
$james->name = "james";
$james2->name = "james2";
$james = null;
echo $james2->name . '
';

执行结果可以清晰地看到,克隆操作确实创建了两个独立的对象,并且__clone()魔术方法被调用。两个对象的销毁顺序也表明它们是独立的,与赋值行为有本质区别。

转载地址:http://rstfk.baihongyu.com/

你可能感兴趣的文章
Openresty框架入门详解
查看>>
openshift搭建Istio企业级实战
查看>>
ORACEL学习--理解over()函数
查看>>
Oracle 递归
查看>>
oracle--用户,权限,角色的管理
查看>>
Oracle11G基本操作
查看>>
Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
查看>>
oracle12安装软件后安装数据库,然后需要自己配置监听
查看>>
Oracle——08PL/SQL简介,基本程序结构和语句
查看>>
oracle下的OVER(PARTITION BY)函数介绍
查看>>
Oracle中DATE数据相减问题
查看>>
Oracle中merge into的使用
查看>>
oracle中sql的case语句运用--根据不同条件去排序!
查看>>
oracle中关于日期问题的汇总!
查看>>
Oracle中常用的语句
查看>>
oracle系统 介绍,ORACLE数据库管理系统介绍
查看>>
org.apache.poi.hssf.util.Region
查看>>
org/hibernate/validator/internal/engine
查看>>
orm总结
查看>>
paddle的两阶段基础算法基础
查看>>