php对象引用和析构函数的关系
在php中构造函数和析构函数都属于魔术方法,比如构造函数在某一个类中,当这个类被实例化的时候就会自动调用,而析构函数是在这个类的对象被销毁的时候自动调用,默认情况下是在程序执行结束时自动调用。
如果我们对对象进行了引用,那么析构函数调用也会改变,如果只实例化了一个对象,比如是$obj那么只要有$obj = null;这个语句时,就表示对象$obj被销毁,这个时候析构函数会被提前调用,但这个类的其他对象不受影响。
如果我们使用$obj1 = &$obj;即使用&符号引用赋值的操作,这个操作不会产生对象的一个新的引用,这所谓的两个对象其实使用同一内存堆空间,当$obj或者$obj1其中一个被销毁时,另一个同时也会消失。
如果使用$obj1 = $obj;操作时,这是直接赋值操作,会产生一个对象的一个新的引用,当$obj或者$obj1其中一个被销毁时,析构函数不会被执行,另外一个对象还可以正常使用,两个都销毁时,析构函数才会执行,这说明两者还是统一的关系,不是两个对象,而是一个引用关系,这个引用操作并不是创建一个互不干扰的新对象,而是引用一个对象,当其中一个对象的成员改变时,另外一个对象的成员随之改变并且相互关联,所以直接用=赋值是介于=&操作和clone操作之间的一种情况。
如果进行clone操作,就是$obj1 = clone $obj;这种操作,$obj1和$obj是两个对象,之间不受任何干扰,改变一个成员不影响另一个成员,在clone是$obj1所有的成员属性值都完全和$obj一样,这才是真正意义上的复制。复制时还可以在类里面写上__clone()魔术方法,给$obj1某些属性一个新值或屏蔽不想要的值,实现方法简单的举个例子。
class Player{
public $name;
function __destruct(){
echo "Destroying ".$this->name."<br />";
}
//设置魔术方法,赋值时会自动调用这里的属性值,作用是初始化值,或屏蔽不想要的值
function __clone(){
$this->name="gbcs";
}
}
$james=new Player();
$james2=clone $james;
echo $james2->name.'<br />';
$james->name="james";
$james2->name="james2";
echo $james->name.'<br />';
$james=null;
echo $james2->name.'<br />';
执行结果如下:

根据执行结果可以清楚地看到,clone产生两个彼此独立的对象,并且也调用了魔术方法__clone(),从析构函数执行顺序也可以看出,两个对象是分开销毁的,和赋值的意义是不同的。
php对象引用和析构函数的关系的更多相关文章
- C++之匿名对象与析构函数的关系
#include <iostream> using namespace std; class Location{ public: Location(, ){ X = xx; Y = yy; ...
- java提高篇(十三)-----equals()方法总结
equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...
- java常用类 --- Object
Object类 Object类是所有Java类的父类,其位于java.lang包中.任何Java对象,如果没有显示定义父类则它默认Object类作为父类. 方法如下: 其中与线程相关的有5个方法: n ...
- 关于equals和hashCode
equals()和hashCode()是Object类的两个函数,重要性可见一斑,不过我们平时使用却未必能深入理解他们.本文从java doc触发,讲到它们与哈希表的关系,再到具体的实现,就我目前掌握 ...
- 3、Object对象的两大方法(hashCode-equals)总结
Object类是所有java类的父类. 用户定义了如下一个Person类 public class Person{} 在类定义中并没有明确继承Object类,但是编译器会自动的完成这个过程. 既然所有 ...
- java中的==和equals的区别
关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...
- Java学习--Equals与“==”
在Java规范中,它对equals()方法的使用必须要遵循如下几个规则: equals 方法在非空对象引用上实现相等关系: 1.自反性:对于任何非空引用值 x,x.equals(x) 都应返回 tru ...
- equals和hashcode
java当中所有的类都继承于Object这个基类,在object中的基类定义了一个equals方法,public boolean equals(Object obj) { return (th ...
- java初学者必看经典
配置java环境变量: JAVA_HOME:配置JDK的目录 CLASSPATH:指定到哪里去找运行时需要用到的类代码(字节码) PATH:指定可执行程序的位置 LINUX系统(在" .ba ...
随机推荐
- PR 不能手动修改素材尺寸的解决方法
选中素材,然后再特效控制台那边点击一下运动就可以在预览窗口直接用鼠标调整画面大小和位移了.
- 查询条件Where
1.字符串 $condition = 'name=\'Lily\' and age>10'; 2.数组 ['type' => 1, 'status' => 1] //生成 (type ...
- Oracle修改数据表
(1)修改数据表中某个字段值为空: update 表明 别名 set 别名.字段名 例子:update JWT_JYWF t set t.jdsbh=''(2)设置数据表中某个字段值和rownu ...
- 积木(DP)问题
问题:Do you remember our children time? When we are children, we are interesting in almost everything ...
- BZOJ-1705 Longge的问题 一维GCD SUM 乱搞+质因数分解+...
2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 1871 Solved: 1172 [Submit][ ...
- 似然估计中为什么要取对数以GMM为例
1.往往假设特征之间独立同分布,那么似然函数往往是连城形式,直接求骗到不好搞,根据log可以把连乘变为连加. 2.另外概率值是小数,多个小数相乘容易赵成浮点数下溢,去log变为连加可以避免这个问题. ...
- POJ1995 Raising Modulo Numbers
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6373 Accepted: ...
- C#获取本机磁盘信息
照着书敲的.留作笔记吧. using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- C语言学习-01第一个C语言程序
一 C语言的历史 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供 ...
- Circular Sequence,ACM/ICPC Seoul 2004,UVa 1584
#include <stdio.h> #include <string.h> #define maxn 105 int lss(const char *s,int p,int ...