register_shutdown_function转换对值的引用?

时间:2014-07-21 23:40:25

标签: php reference

我正在尝试使用关闭函数,该函数使用注册后动态更改的值。我的理解是,通过引用传递变量将允许更改代码的后续部分以影响关闭调用。下面的代码表明情况并非如此:

<?php
    $x = 0;
    function shutdown(&$x) {echo $x;}
    register_shutdown_function('shutdown',$x);
    $x = 1;
    exit();
?>

我误解了应该怎么做?寄存器函数的预期行为是将引用传递转换为值传递吗?

PHP版本5.5.9

1 个答案:

答案 0 :(得分:3)

可能的解决方案之一是使用匿名函数(在这种情况下它是一个闭包,$x被捕获作为参考):

$x = 0;

$shutdown = function() use(&$x) { echo $x; };

register_shutdown_function($shutdown);
$x = 1;

exit();

演示:http://ideone.com/L2cYJp

UPD :解释您的解决方案无效的原因:

如果查看register_shutdown_function签名:

void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )

您将看到参数是按值传递的。就是这样 - $x行中register_shutdown_function('shutdown',$x);的值按值传递,并等于调用时的值。

如果您定义了接受引用的函数无关紧要,因为您已经丢失引用(间接地,通过使用不考虑它的函数)而接受引用为时已晚。