取消设置变量与设置为 ''

Posted

技术标签:

【中文标题】取消设置变量与设置为 \'\'【英文标题】:Unsetting a variable vs setting to ''取消设置变量与设置为 '' 【发布时间】:2011-01-03 15:15:30 【问题描述】:

执行以下操作之一是否更好?如果不是,其中一个是否比另一个快?

unset($variable);

或去做

$variable = '';

【问题讨论】:

【参考方案1】:

他们会做一些稍微不同的事情:

unset 将从符号表中删除变量,并将内容的引用计数减 1。之后对变量的引用将触发通知(“未定义变量”)。 (注意,对象可以通过实现 __unset() 覆盖其属性的默认未设置行为)。

设置为空字符串会将内容的引用计数减1,将内容设置为长度为0的字符串,但符号仍会保留在符号表中,您仍然可以引用变量. (注意,对象可以通过实现 __set() 覆盖其属性的默认赋值行为)。

在较旧的 php 中,当 ref 计数降至 0 时,将调用析构函数并立即释放内存。在较新的版本 (>= 5.3) 中,php 使用缓冲方案,可以更好地处理循环引用 (http://www.php.net/manual/en/features.gc.collecting-cycles.php),因此内存可能会在以后被释放,但它可能根本不会被延迟......无论如何,这实际上不会导致任何问题,并且新算法可以防止某些内存泄漏。

如果变量名不再使用,unset 应该快几个 cpu 周期(因为不需要创建新内容)。但是如果变量名被重复使用,php 将不得不创建一个新的变量和符号表条目,所以它可能会更慢!在大多数情况下,差异可以忽略不计。

如果您想将变量标记为无效以供以后检查,您可以将其设置为 false 或 null。这会比使用 isset() 测试更好,因为变量名中的拼写错误会返回 false 而不会出现任何错误...您还可以将 false 和 null 值传递给另一个函数并保留标记值,这是无法做到的一个未设置的变量...

所以我会说:

$var = false; ...
if ($var !== false) ...

$var = null; ...
if (!is_null($var)) ...

比检查哨兵值更好

unset($var); ...
if (isset($var)) ...

【讨论】:

【参考方案2】:

从技术上讲,$test = '' 将返回 true

if(isset($test))

因为它仍然是“设置”,所以它只是设置为空值。

然而它会返回 true 到

if(empty($test))

因为它是一个空变量。这仅取决于您要检查的内容。通常人们倾向于检查一个变量是否为 isset,而不是它是否为空。

所以最好完全取消设置。

另外,这更容易理解

unset($test);

比这个

$test = '';

第一个立即告诉您该变量不再设置。后者只是告诉您它被设置为空白区域。当您要向变量添加内容并且不希望 PHP 出错时,这通常使用。

【讨论】:

【参考方案3】:

您正在做不同的事情,unset 的目的是在您创建它的上下文中销毁指定的变量,您的第二个示例只是将变量设置为空字符串。

取消设置变量不会强制立即释放内存,如果您担心性能,将变量设置为NULL 可能是更好的选择,但实际上,差异不会很明显...

docs讨论过:

unset() 就像它的名字所说的那样 - 取消设置变量。它不会强制立即释放内存。 PHP的 垃圾收集器会在它发生时 看到合适 - 有意尽快,如 无论如何都不需要那些CPU周期, 或者在脚本之前 内存不足,无论发生什么 首先。

如果你正在做 $whatever = null; 那么你正在重写变量的 数据。你可能会释​​放内存/ 缩小得更快,但它可能会窃取 CPU 从真正需要的代码循环 他们更快,导致更长的时间 总执行时间。

【讨论】:

【参考方案4】:

我认为最相关的区别是取消设置变量表明该变量不会被后续代码使用(如果您尝试使用它,它还会通过报告 E_NOTICE 来“强制”这一点,正如 jspcal 所说,这是因为它不是在符号表中)。

因此,如果空字符串是您对变量所做的任何事情的合法(或标记)值,请继续将其设置为 ''。否则,如果变量不再有用,取消设置它会使代码意图更清晰。

【讨论】:

我不敢相信没有其他人提到E_NOTICE...我的上帝,任何仍然忽略这一点的人都需要用正确的编译器砸头! 【参考方案5】:

它们有完全不同的含义。前者使变量不存在。后者只是将其值设置为空字符串。可以说哪个“更好”并不重要,因为它们用于完全不同的事物。

你是想清理内存还是什么?如果是这样,不要; PHP 会为您管理内存,因此您可以随意放置它,它会自动清理。

如果您不想清理内存,那么您需要弄清楚为什么要取消设置变量或将其设置为空,然后选择合适的变量。对此进行良好的健全性检查:假设有人在您的未设置/清空之后的某处插入了以下代码行:

if(strcmp($variable, '') == 0)  do_something(); 

然后,稍后:

if(!isset($variable))  do_something_else(); 

如果您将变量设置为空字符串,第一个将运行do_something()。如果您取消设置变量,第二个将运行do_something_else()。如果您的脚本运行正常,您希望运行其中哪些?

【讨论】:

【参考方案6】:

这里还需要考虑另一个“问题”,即参考。

如果你有:

$a = 'foobar';
$variable =& $a;

那么做你的两个选择中的任何一个都是完全不同的。

$variable = '';

将 $variable 和 $a 都设置为空字符串,其中 as

unset($variable);

删除 $a 和 $variable 之间的引用链接,同时从符号表中删除 $variable。这确实是在不设置 $variable 引用其他内容的情况下取消链接 $a 和 $variable 的唯一方法。注意,例如,$variable = null;不会的。

【讨论】:

以上是关于取消设置变量与设置为 ''的主要内容,如果未能解决你的问题,请参考以下文章

在 grunt-env 中取消设置环境变量

X-Forwarded-Proto 为 http 时取消设置 HTTPS 环境变量

取消设置变量不起作用

“header()” php 函数是不是取消设置全局变量?

在bash中取消设置变量检查

如何在代码块中运行我的程序之前设置/取消设置环境变量