php internals - 通过引用传递的 PHP 局部变量能否可靠地在函数外部生存


php internals - Will a PHP local variable passed by reference reliably survive outside a function?

>基本上,在处理大型数组的情况下,如果发生错误,null传递回去很方便,因为如果$array = null那么$array[] = 1[ 1 ]的,null也可以在可调用的上下文中使用,即。 function (array $array = null)将接受null作为可接受的值。基本上null很方便,因为如果您有错误处理代码,您可以轻松地将其识别为错误,但如果您不在乎,也可以轻松忽略它。

在大多数情况下,这是相当简单的,但是有一个极端情况,PHP 并没有真正很好地支持它,那就是在函数的上下文中传回引用时,该函数不一定接受引用,但有时需要将 null 传回,但有时将引用传回(大多数情况下这不是问题,因为您返回对实例变量的引用,但是有时情况并非如此)。还有一种情况是以不尴尬的方式调用具有null值的函数。

传递引用的原因显然是为了省去复制数组的麻烦(尤其是当它非常大时)。

以下"解决方案"...

'error_reporting(-1);
function & nil()
{
    $nil = null;
    return $nil;
}
function & pass(array & $variable = null)
{
    return $variable;
}
function & check ()
{
    return nil();
}
$test = pass(nil());
$test = &pass(nil());
$test1 = &check();
$test1[] = 1;
$test2 = &check();
$test2[] = 2;
'var_dump($test1, $test2);

有效,但是...

我的问题是 PHP 是否保证在对局部变量的所有引用都被垃圾回收之前不会被垃圾回收? 还是未定义的行为。

当引用计数大于 0 时,PHP 永远不会 GC 任何内容。