与 PHP 闭包中的“使用”标识符混淆
Posted
技术标签:
【中文标题】与 PHP 闭包中的“使用”标识符混淆【英文标题】:Confusion with 'use' identifier in PHP closures 【发布时间】:2013-09-08 02:24:59 【问题描述】:我对 php 闭包有点困惑。谁能帮我解决这个问题:
// Sample PHP closure
my_method(function($apples) use ($oranges)
// Do something here
);
$apples
和 $oranges
有什么区别,我应该什么时候使用它们?
【问题讨论】:
In PHP 5.3.0, what is the function "use" identifier?的可能重复 【参考方案1】:$apples
将采用在调用时传递给函数的值,例如
function my_method($callback)
// inside the callback, $apples will have the value "foo"
$callback('foo');
$oranges
将引用变量$oranges
的值,该变量存在于您定义闭包的范围内。例如:
$oranges = 'bar';
my_method(function($apples) use ($oranges)
// $oranges will be "bar"
// $apples will be "foo" (assuming the previous example)
);
区别在于$oranges
在函数定义时绑定,$apples
在函数调用时绑定。
闭包可以让你访问定义在函数之外的变量,但是你必须明确告诉 PHP 哪些变量应该可以访问。如果变量是在全局范围内定义的,这与使用 global
关键字类似(但不等价!):
$oranges = 'bar';
my_method(function($apples)
global $oranges;
// $oranges will be "bar"
// $apples will be "foo" (assuming the previous example)
);
使用闭包和global
的区别:
global
仅适用于全局变量。
闭包在闭包定义时绑定变量的值。定义函数后对变量的更改不会影响它。
另一方面,如果您使用global
,您将收到该变量在函数被调用时的值。
例子:
$foo = 'bar';
$closure = function() use ($foo)
echo $foo;
;
$global = function()
global $foo;
echo $foo;
;
$foo = 42;
$closure(); // echos "bar"
$global(); // echos 42
【讨论】:
它与使用global
有何不同,因为这是我首先想到的。
@enchance:因为use
可以访问本地范围内的变量。当您执行 use ($oranges)
时,$oranges
不需要像您执行 global $oranges;
时那样是全局的。
global
is not 等效于use
,因为global
将引用纯全局上下文(也由$GLOBALS
表示),而use
将仅通过当前的本地环境。
@AlmaDoMundo:没错,这就是我说它不等价的原因。
@enchance:添加了解释。【参考方案2】:
$apples
作为参数传递给my_method
,$oranges
被注入其中。
【讨论】:
以上是关于与 PHP 闭包中的“使用”标识符混淆的主要内容,如果未能解决你的问题,请参考以下文章