与 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 闭包中的“使用”标识符混淆的主要内容,如果未能解决你的问题,请参考以下文章

YDKJS:作用域与闭包

浅谈js闭包

phalcon—— PHP基础知识

如何在 Windows 上获取磁盘的标识符?

PHP中的命名空间

foreach 标识符和闭包