ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 对象在内存中的存在形式和对象默认的传递方式 1. $person2 = $person ``` $person = new Person(); $person2 = $person; 说明:把一个对象赋值给另一个变量,这个也是值传递,但是这个值传递的是对象的引用(可以理解为对象标识符),即每个包含对象的变量都持有对象的引用(reference),而不是整个对象的拷贝。 ``` ![](https://i.vgy.me/VTwjSQ.png) 2. $person2 = &$person ![](https://i.vgy.me/WbAfbT.png) # 析构方法 定义:在系统销毁对象时,会自动触发析构方法,去释放或销毁对象在创建的时候,分配的相关资源。 ``` public function __destruct(){ 代码块;//可以去释放相关资源 } ``` 触发时机: * 程序运行结束后,对象被销毁时 * 当没有变量指向对象时,也就是对象没人使用了,比如unset()或者对象变量指向了其它数据 析构方法调用的顺序: * 先创建的对象,后被销毁 * 后创建的对象,先被销毁 # PHP的垃圾回收机制 基本介绍: * 在PHP中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,PHP将启用垃圾回收将对象销毁 * 当程序退出前,PHP也将启用垃圾回收器,销毁对象 # 魔术方法 基本介绍: * 由系统自动调用 * 函数名的开头 由__两个下划线 特别说明: PHP将所有以__(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以__为前缀 魔术方法概览: 1. ``` __construct 构造方法 __destruct 析构方法 ``` 2. ``` __call($method_name,$args) 在对象调用一个不可访问方法时(比如函数private/protected/不存在),__call会被调用 __callStatic($method_name,$args) 与上面一致,只不过这个指的是静态方法 ``` 3. ``` __get($pro_name) 当去访问一个不可以访问的属性(property)时(取值),默认会调用魔术方法__get __set($pro_name,$value) 当去访问一个不可以访问的属性(property)时(赋值),默认会调用魔术方法__set ``` 4. ``` __isset($pro_name) 当对不可访问属性(比如:private/protected/不存在)调用isset()或empty()时,__isset()会被调用 __unset($pro_name) 当对不可访问属性(比如:private/protected/不存在)调用unset()时,__unset()会被调用 ``` 5. ``` __sleep __wakeup ``` 6. ``` __toString() 将类以字符串的形式输出 ``` 7. ``` __set_state ``` 8. ``` __clone() 如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用 克隆与被克隆的对象指向的内存空间不同,只是普通的备份,不会像对象赋值一样,传递引用 ```