register_shutdown_function将引用转换为值?

The*_*Box 5 php reference

我正在尝试使用关闭功能,该功能使用注册后动态更改的值。我的理解是通过引用传递变量将允许在代码的后续部分中进行更改以影响关闭调用。下面的代码演示事实并非如此:

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

我误会了应该怎么做?寄存器功能将参考传递转换为值传递的预期行为是吗?

PHP版本5.5.9

zer*_*kms 5

一种可能的解决方案是使用匿名函数(在本例中为闭包,以$x捕获为参考):

$x = 0;

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

register_shutdown_function($shutdown);
$x = 1;

exit();
Run Code Online (Sandbox Code Playgroud)

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

UPD:解释为什么您的解决方案不起作用:

如果您看一下register_shutdown_function签名:

void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )
Run Code Online (Sandbox Code Playgroud)

您将看到参数通过值传递。这就是它-的价值$x在register_shutdown_function('shutdown',$x);行按值传递和等于它是在调用的瞬间值。

如果您定义了接受引用的函数,则无所谓,因为为时已晚,因为您已经丢失了引用(通过使用不考虑引用的函数来接受引用)已经太晚了。