PHP闭包中use()中变量加&符号的区别

闭包中use()传递变量,加来了&符号表示传递变量内存地址,闭包中访问此变量时变成了访问该变量所指向的地址,以下PHP代码演示

//输出: This is a closure use object, msg is: Hello, everybody.<br />\n
//还是按照上面的步骤, 按部就班的来吧:
//1. obj名字指向Hello, everyone对象
//2. 闭包产生一个引用指向Hello, everyone对象
//3. 修改obj名字指向的对象(即Hello, everyone对象)的scalar值
//4. 执行闭包, 输出的自然是Hello, everybody, 因为其实只有一个真正的对象
$obj = (object) "Hello, everyone";
$callback = function () use ($obj) {
    print "This is a closure use object, msg is: {$obj->scalar}. <br />\n";
};
$obj->scalar = "Hello, everybody";
callback($callback);
 
//输出: This is a closure use object lazy bind, msg is: Hello, everybody.<br />\n
//闭包引用的是什么呢? &$obj, 闭包产生的引用指向$obj这个名字所指向的地址.
//因此, 无论obj怎么变化, 都是逃不脱的....
//所以, 输出的就是改变后的值
$obj = (object) "Hello, everyone";
$callback = function () use (&$obj) {
    print "This is a closure use object lazy bind, msg is: {$obj->scalar}. <br />\n";
};
$obj = (object) "Hello, everybody";
callback($callback);


评论