起因

因为感兴趣于unset($var)和$var=null的区别,于是找了一个stackoverflow高分问题及答案,翻译以供参考。

问题篇

Q:

我意识到第二个方法避免了函数调用的消耗(更新,实际是语言结构),但是我对于哪一个更好很有兴趣。我过去常常使用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);

}

以上代码在PHP5.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,PHP中unset和null的比较相关推荐

  1. php 数组对比 unset,如何区分PHP中unset,array_splice的区别

    1.使用的函数 a.函数unset()unset ( mixed $var , mixed $... = ? ) : void unset()销毁指定的变量. b.函数array_slice()arr ...

  2. php中unset函数是在哪一章_PHP unset函数原理及使用方法解析

    unset―释放给定的变量 说明 unset(mixed$var[,mixed$...] ) :void unset()销毁指定的变量. unset()在函数中的行为会依赖于想要销毁的变量的类型而有所 ...

  3. php中unset函数是在哪一章_PHP unset函数好奇怪 -

    PHP输出的奇怪问题阿!!!求大神帮忙看看我看了一天没看懂哪里来的奇怪字符首先我刚开始学php 写了个从数据库读完后 输出JSON的过程看上去结果是对的阿~~~ 然后我去某效验网站 提示我 unset ...

  4. PHP中unset,array_splice删除数组中元素的区别

    php中删除数组元素是非常的简单的,但有时删除数组需要对索引进行一些排序要求我们会使用到相关的函数,这里我们来介绍使用unset,array_splice删除数组中的元素区别吧 如果要在某个数组中删除 ...

  5. php unset 多可以什么_php unset()销毁单个或多个变量

    php unset()销毁单个或多个变量unset函数是php自带的一个销毁变量的函数,我们介绍了利用unset来销毁静态变量与全局变量的方法,同时出可以销毁数组变量哦,下面我们看实例. 例 1. u ...

  6. php7 unset函数,深入理解 PHP7 unset 真的会释放内存吗?

    一.关于unset的一些说法 有人说:unset() 并不真正释放内存: unset() 函数只能在变量值占用内存空间超过 256 字节时才会释放内存空间: 只有当指向该变量的所有变量(如引用变量)都 ...

  7. mysql 中is not null 和 !=null的区别

    今天做定时任务,需要用到一个mysql查询 于是我就写: sqlcondition=" and fplsh!=null and iskp='2'" 却发现发挥的list为空 很是诧 ...

  8. mysql''和null,mysql中NULL和null的区别

    接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...

  9. Shell中的/dev/null 21 与 21 /dev/null 与/dev/null 的区别

    转自:http://blog.csdn.net/reyleon/article/details/11595985 默认情况下,总是有三个文件处于打开状态,标准输入(键盘输入).标准输出(输出到屏幕). ...

最新文章

  1. shinyapps安装
  2. 吕布流水账 -- 纪念我的爱情
  3. 这是一篇能让你升职加薪,赢娶白富美的文章
  4. pandas(一)-- Series创建及索引
  5. Linux操作系统笔记——Shell变量
  6. Centos7 更新gcc版本
  7. oracle的操作大全,Oracle数据库操作大全(六)Oracle中操作数据
  8. Java写入Excel文件
  9. matlab问题利用M文件比较两个数大小,Matlab中写M文件及调用
  10. 【C++】为什么INT_MIN不是直接写成-2147483648(转载)
  11. Spring Boot 初体验(8)配置server信息
  12. svm出现浮点数与字符串不能计算的错误(label必须为 整形或浮点型)
  13. SkinSharp破解版与模版皮肤下载与使用
  14. 如何制作Linux程序启动脚本
  15. Stata 中 profile.do 的设定
  16. 华硕主板关闭Secure Boot步骤 :(支持b460/b560/b660主板)
  17. 在Unity实现Canny边缘检测
  18. 农业物联网智能灌溉的功能特点
  19. win7 电脑如何内外网同时使用
  20. 新装win10系统的桌面没有“我的电脑”图标解决办法

热门文章

  1. python中布尔值是什么意思_Python中的布尔值
  2. linux nc 传送文件,Linux下nc命来实现文件传输
  3. Mac pro配置minIo客户端
  4. python 拟合圆心_如何用python中的最小二乘法求圆心?
  5. STM32L051测试 (五、串口测试 — 与Enocean模块通讯问题)
  6. 联想T25系列服务器,宛如初见,为ThinkPad 25刷入复古情怀
  7. jar包冲突如何排查
  8. linux中的硬件抽象层
  9. 抗抑郁药如何帮助细菌抵抗抗生素
  10. 基于java大型商场应急预案管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署