PHP 的显式变量在闭包中使用时的优势

Advantage of PHP's explicit variable when used in closure

本文关键字:闭包 变量 PHP      更新时间:2023-09-26

在PHP中,如果你想访问外部作用域中的变量,你需要显式声明它,例如

$foo = 'bar';
func (function() use ($foo) {
    echo $foo;
});

但在 JavaScript 中,它们是隐式的,例如

foo = 'bar';
func (function() {
    console.log(foo);
});

这两种闭合的优缺点是什么?

在 PHP 中,如果你想访问外部作用域中的变量,你需要 明确声明 [...] use ($foo)

从技术上讲,您的函数不访问外部作用域中的$foo。为此,您需要:

$foo = 'bar';
$func = function() {
    global $foo;
    echo $foo;
};

这不是结束。函数中没有关闭任何变量。如果更改了 $foo 的值,则对 func 的下一次调用将反映:

$func(); // bar
$foo = 'baz';
$func(); // baz

但是,如果我们以func $foo结束:

$foo = 'bar';
$func = function() use ($foo) {
    echo $foo;
};
$func(); // bar
$foo = 'baz';
$func(); // bar

func$foo将保留它的值,因为它已被封闭到函数中。

要在 JavaScript 中执行相同的操作,您只需在函数内创建一个函数,然后创建一个闭包(允许内部函数访问封闭函数的范围):

function getFunc(foo) {
    return function () {
        console.log(foo);
    };
}
foo = "bar";
func = getFunc(foo);
func(); // bar
foo = "baz";
func(); // bar

这两种闭合的优缺点是什么?

使用"堆"类型作用域,而不是堆栈,以便变量环境保持附加到函数,使一等函数更加灵活,因为它们可以传递和调用,而不必担心创建(或传入)一组特定的变量以使函数可用。

PHP 这样做是因为它不知道你是否打算使用外部变量,因为未设置的变量就像一个空字符串。因此,这种类型的闭包对于PHP是必需的,但对于Javascript则不是必需的。