我意识到第二种方法避免了函数调用的开销(update,实际上是一种语言构造),但是知道其中一种方法是否比另一种方法更好会很有趣.我的大部分代码都使用unset(),但最近我查看了几个从网上找到的值得尊敬的类,它们使用$var = null代替.

有没有首选的,理由是什么?

推荐答案

这是在unset manual's page in 2009年前提到的:

unset()正如它的名字所说的那样-取消设置一个变量.它不强制立即释放内存.PHP的垃圾收集器将在发现合适的意图时立即执行此操作,因为无论如何都不需要这些CPU周期,或者直到脚本耗尽内存之前(无论先发生什么).

如果你做的是$whatever = null;,那么你就是在重写变量的数据.您可能会更快地释放/收缩内存,但它可能会更快地从真正需要它们的代码中窃取CPU周期,从而导致更长的总体执行时间.

(自2013年以来,这unset man page个项目不再包括该部分)

注意,直到php5.3.如果有two objects in circular reference,例如在父子关系中,对父对象调用unset()将不会释放子对象中用于父引用的内存.(当父对象被垃圾收集时,内存也不会被释放.)(bug 33595)


问题"difference between unset and = null"详细说明了一些不同之处:


unset($a)还会从符号表中删除$a;例如:

$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);

输出:

Notice: Undefined variable: a in xxx
NULL

但当使用$a = null时:

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);

输出:

NULL

$a = null似乎比unset()快一点:更新符号表条目似乎比删除它要快.


  • 当您试图使用一个不存在的(unset)变量时,将触发一个错误,变量表达式的值将为空.(因为,PHP还应该做什么?每个表达式都需要产生一些值.)
  • 不过,赋值为NULL的变量仍然是完全正常的变量.

Php相关问答推荐

PHP Array to Powershell exec命令Args

从产品中获取WooCommerce产品属性单选按钮的列表WP_Query

为什么调用干预\映像引发错误驱动程序\GD\Driver not found?

如果再次调用SESSION_START(),会话.gc-max是否会重新启动?或者它是从第一次创建会话开始计算的?

在函数内部获取一致的单选按钮值以更新WordPress用户数据

添加登录:需要app.yaml仍然允许所有拥有Google帐户的人访问

PHP从响应应用程序json获取文件代码和URL

使用php创建表格和插入数据

在WooCommerce管理中 for each 运输方法设置添加自定义字段

Chillerlan/php-iOS名称字段的QR vCard错误

Laravel处理belongToMany和额外字段

打折时更改 Woocommerce 产品名称

对产品/库存结果集进行分组和计数,形成多维分层数组

单个产品页面 WooCommerce 订阅价格字符串的更改

Docker-用于部署的 PHP 应用程序映像无法在本地运行

使用自定义插件中的 WooCommerce 模板发送自定义邮箱

如何使用相同的变量使函数参数对于数组和字符串都是可选的

password_verify 在 PHP 7.4 中有效,但在 PHP 8.2 中无效

如何从 PHP 中的字符串位置排除图像扩展名

使用 v-for 的存储链接中的 Img src 在 Laravel vuejs 中不起作用