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

wai*_*933 8 php variables unset

是否有更好的形式来做以下其中一种?如果不是,其中一个比另一个快吗?

unset($variable);
Run Code Online (Sandbox Code Playgroud)

或者做

$variable = '';
Run Code Online (Sandbox Code Playgroud)

jsp*_*cal 11

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

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

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

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

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

如果要将变量标记为无效以便以后检查,可以将其设置为false或null.这比用isset()测试更好,因为变量名中的拼写错误会返回false而没有任何错误...你也可以将false和null值传递给另一个函数并保留sentinel值,这是不能用的一个未设置的变量...

所以我会说:

$var = false; ...
if ($var !== false) ...
Run Code Online (Sandbox Code Playgroud)

要么

$var = null; ...
if (!is_null($var)) ...
Run Code Online (Sandbox Code Playgroud)

比检查哨兵值更好

unset($var); ...
if (isset($var)) ...
Run Code Online (Sandbox Code Playgroud)