PHP中unset和null的比较

栏目: 编程语言 · PHP · 发布时间: 6年前

内容简介:PHP中unset和null的比较,从做了什么、代码可读性、耗时作比较

##问题篇

##Q:

PHP 把变量 unset 掉还是设置成 null 更好?

我意识到第二个方法避免了函数调用的消耗(更新,实际是语言结构),但是我对于哪一个更好很有兴趣。我过去常常使用 unset(),但是我看到很多受人尊敬的类使用 $var=null 替代。哪一个更适合为什么?

##答案篇

##A1

unset就像其名字所说的一样-删除一个变量。他不强制立即释放缓存。PHP的“垃圾”在适当的时候将会回收-出于速度的角度考虑,在CPU周期或者直到内存耗尽之前,无论发生什么,都不释放内存。

如果你正在使用$whatever=null,将会重写变量的数据。你本想使内存释放、缩小地更快,但是可能会占用CPU周期,导致总体执行时间更长。

2013年后,PHP Manual不再包含这个区块。

值得注意的是:PHP5.3之前,如果你有两个处于循环引用的对象,比如是“父子”类的关系,父类实例调用unset方法,将不会释放使用父类引用的子类的内存。(当父实例被垃圾回收时,也不会释放内存。)

上边那句话结合代码就很好理解了:

class Test{
	public $var = 'test variable';
}
while(true){
	$test = new Test();
	$test->test = $test;
	unset($test);
}

以上代码在 PHP 5.3之前,运行后,内存占用持续增加,最终导致 “PHP Fatal error: Allowed memory size of xxxxx bytes exhausted”。但这并不是这篇文章的重点(作者注:之后的博客会介绍自己对“PHP垃圾回收”的理解),暂且只列出的解决办法:

class Test{
	public $var = 'test variable';
}
while(true){
	$test = new Test();
	$test->test = $test;
	unset($test->test);//先删除掉引用变量
	unset($test);
}

使用unset($var)会把$var从符号表删除。比如:

$var = 'hello world';
unset($var);
var_dump($var);
//output:undefined $var

当使用$a=null时:

$var = 'hello world';
$var = null;
var_dump($var);
//output:null

看起来$var=null比unset($var)要快一些:因为更新符号表条目比删除它更快(作者注:PHP版本不同而不同)。

当你删除一个不存在的变量时,将会触发一个错误,变量表达式的值将也会是null。

如果一个变量设置成了null,仍将是一个的普通变量。

##A2

unset实际上不是一个函数,而是一个语言结构体。

不考虑性能,使用unset使你的代码更加清晰。

##A3

有回答者做了一个实验比较unset和赋值null,实验代码如下,实验PHP版本包括PHP5.1-5.4,PHP5.0和PHP4.4,我对PHP5.6、PHP7.0、PHP7.1作了补充(作者注:实验结果可能跟机器配置有关系)。

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
	$a = 'a';
	$a = NULL;
}
$elapsed = microtime(true) - $start;
echo "took $elapsed seconds\r\n";

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
	$a = 'a';
	unset($a);
}
$elapsed = microtime(true) - $start;
echo "took $elapsed seconds\r\n";

|版本 | null执行时间(s) | unset执行时间(s) | null和unset哪个更快 | ------------ | ------------ | |PHP7.1 | 0.22593188285828 | 0.19007802009583 | unset |PHP7.0|0.54828405380249|0.60010099411011|null |PHP5.6|0.72876906394958|1.9859180450439|null |PHP5.4|0.88389301300049|2.1757180690765|null |PHP5.3|1.7235369682312|2.9490959644318|null |PHP5.2|3.0069220066071|4.7002630233765|null |PHP5.1|2.6272349357605|5.0403649806976|null |PHP5.0|10.038941144943|7.0874409675598|unset |PHP4.4|7.5352551937103|6.6245851516724|unset


以上所述就是小编给大家介绍的《PHP中unset和null的比较》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

史蒂夫·乔布斯传

史蒂夫·乔布斯传

[美] 沃尔特·艾萨克森 / 管延圻、魏群、余倩、赵萌萌、汤崧 / 中信出版社 / 2011-10-24 / 68.00元

这本乔布斯唯一授权的官方传记,在2011年上半年由美国出版商西蒙舒斯特对外发布出版消息以来,备受全球媒体和业界瞩目,这本书的全球出版日期最终确定为2011年11月21日,简体中文版也将同步上市。 两年多的时间,与乔布斯40多次的面对面倾谈,以及与乔布斯一百多个家庭成员、 朋友、竞争对手、同事的不受限的采访,造就了这本独家传记。 尽管乔布斯给予本书的采访和创作全面的配合,但他对内容从不干......一起来看看 《史蒂夫·乔布斯传》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具