以下代码是
中示例的略微修改版本PHP Manual -> Language Reference -> Functions -> Anonymous functions
示例提到但不解释为什么不能按值传递PHP对象 到函数中use关键字后面的参数列表。特别是,为什么不呢 在use参数列表中按值传递的对象,如下面的代码所示 复制到$ broken匿名函数里面就像用标量值一样?
以下是代码:
class MyClass {
function doSomething() { echo "HELLO WORLD\n"; }
}
$myInstance = null;
$broken = function() use ($myInstance) {
if(!empty($myInstance)) $myInstance->doSomething();
else echo "\$myInstance is empty.\n";
var_dump($myInstance); // NULL
};
$working = function() use (&$myInstance) {
if(!empty($myInstance)) $myInstance->doSomething();
else print "\$myInstance is empty.\n";
};
$myInstance = new MyClass();
$myInstance->doSomething(); // Outputs HELLO WORLD.
$broken(); // Outputs $myInstance is empty. NULL
$working(); // Outputs HELLO WORLD.
感谢。
这是我收到Valentin Rodygin回复后对我帖子的更新。 如果$ myInstance = null; line被注释掉我收到以下错误:
Notice: Undefined variable: myInstance in C:\xampp\htdocs\myexamples\use.php on line 11
基本上,当use关键字的参数按值传递时,它将被复制到 时间定义了使用use关键字的函数,而不是函数时 调用use关键字。变量也是如此 通过引用传递,但因为它们是通过引用传递的,所以后来的任何修改 在调用函数之前对这样的变量进行更新后的值 函数内部可用的变量。
感谢。
答案 0 :(得分:2)
让我们仔细看看你的代码。
$myInstance = null;
$broken = function() use ($myInstance) {
if(!empty($myInstance)) $myInstance->doSomething();
else echo "\$myInstance is empty.\n";
var_dump($myInstance); // NULL
};
此时,您已经创建了一个闭包并传递了变量的副本,并且它是NULL。
$working = function() use (&$myInstance) {
if(!empty($myInstance)) $myInstance->doSomething();
else print "\$myInstance is empty.\n";
};
在这里你传递了一个引用,所以稍后,当你实例化$ myInstance时,它会在闭包中被访问。