
PHP的变量或对象的销毁可以分成显式销毁和隐式销毁:
1、显式销毁,当对象没有被引用时就会被销毁,所以我们可以unset或为其赋值NULL;
2、隐式销毁,PHP是脚本语言,在代码执行完最后一行时,所有申请的内存都要释放掉;
从上面两种销毁方式中,我们可以总结出销毁的三种方法:那就是
1、unset()
2、$varname=null
3、析构函数__destruct()
举例来说:
class Human { public $name = '张三'; public $gender = null; public function __destruct() { echo '死了!
'; } } $a = new Human(); $b = $c = $d = $a; unset($a); $d=null; echo '
'; var_dump($a); echo '
'; var_dump($b); echo '
'; var_dump($c); echo '
'; var_dump($d); 结果如下: Notice: Undefined variable: a in /Library/WebServer/Documents/test.php on line 42 NULL object(Human)#1 (2) { ["name"]=> string(6) "张三" ["gender"]=> NULL } object(Human)#1 (2) { ["name"]=> string(6) "张三" ["gender"]=> NULL } NULL 死了!
首先,我们要知道,在PHP中,变量名是存储在内存栈中,它是指向堆中具体内存的地址,通过变量名查找堆中的内存;因此我们可以得出结论:
Copier après la connexion
结果是:
Notice: Undefined variable: a in E:\amp\apache\htdocs\index.php on line 5 NULL int(1)
所以,unset()并没有真正销毁变量中内存值,仅仅是切断了变量与内存之间的关系,并将变量名也给干掉了,但内存只要还被引用着就不会被释放;而在PHP中对象的传值默认是引用传值,这也解释了Human类中,$a被unset()了,但是$b =$c = $d 一样有值。
2、$varname=null,变量名依然存在,但是内存值却被干掉了。那么在引用传值的情况下又是如何呢?举例:
Copier après la connexion
输出的结果是: NULL NULL
所以,$varname=null,虽然变量名和内存指向都还存在,但是内存中的值却是完全删除掉了。
3、从上例子可以看出,析构函数__destruct()是在PHP执行完最后一段代码的时候,才启动,但是这样理解并不够精准,举例
name; unset($a); //销毁函数 $a = new Human; echo '***********************'; 输出的结果是: 开始结束***************************结束
class Human{ public $name = '开始'; public function __destruct(){ echo '结束'; }} $a = new Human; $b = $a; echo $a->name; unset($a); //销毁函数 $a = new Human; echo '***************************'; 结果是: 开始***************************结束结束
以上结果说明,代码并没有执行完最后一行的时候启动,而是当对象销毁的时候.自动执行。之所以在human()函数也有unset()的情况下,析构函数__destruct()还是在最后执行,那是因为引用传值,对象的内存并没有取消,对象并没有完全销毁导致。
所以结论是:如果没有人为销毁的话,则在代码执行结束之后,系统自动释放内存时执行析构函数__destruct(),如果对象有销毁的时候,则自动执行析构函数。
推荐教程:PHP视频教程
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Comment ouvrir le fichier php
Comment supprimer des pages vierges dans Word
Comment supprimer les premiers éléments d'un tableau en php
Que faire si la désérialisation php échoue
Comment connecter PHP à la base de données mssql
Comment connecter PHP à la base de données mssql
Résumé des connaissances de base de Java
Comment télécharger du HTML