2

lambda 或匿名函数只是一个没有名称的函数。

例如

$lambda = function($a, $b) { echo $a + $b; };

闭包是一个函数,它可以访问未在其参数列表中指定的变量。在 PHP 5.3+ 中,这些变量在 use 关键字之后指定,并在执行闭包函数的函数定义时通过值或引用链接。

例如

$foo = 'hello';
$closure = function() use ($foo) { echo $foo; };
$closure();

在 JavaScript 中,所有函数都是闭包,因为当函数嵌套时,存在一个作用域链,而例如最里面的函数可以访问 1. 它的局部变量,2. 函数在其封闭范围内的局部变量,称为它的闭包作用域,3. 闭包作用域的闭包作用域的局部变量,称为闭包作用域的闭包作用域,...,以此类推,直到我们也可以访问 N. 定义在最高范围。在最内层范围内用 var 声明的变量会掩盖在外层范围内的变量,否则如果最内层变量与在外层范围内的变量同名但未用 var 声明,则使用来自外层范围的变量。

var zero = 0; // global scope
function f1() {
  var one = 1; // third-level closure scope of f4
  function f2() {
    var two = 2; // second-level closure scope of f4
    function f3() {
      var three = 3; // first-level closure scope of f4
      function f4() {
        var four = 4;  // local scope of f4
        console.log(zero + one + two + three + four);
      }
      f4();
    }
    f3();
  }
  f2();
}
f1();

这等效于以下 PHP 代码:

<?php
$zero = 0; // global scope
$f1 = function() use ($zero) {
  $one = 1; // third-level closure scope of f4
  $f2 = function() use ($zero, $one) {
    $two = 2; // second-level closure scope of f4
    $f3 = function() use ($zero, $one, $two) {
      $three = 3; // first-level closure scope of f4
      $f4 = function() use ($zero, $one, $two, $three) {
        $four = 4;  // local scope of f4
        echo $zero + $one + $two + $three + $four;
      };
      $f4();
    };
    $f3();
  };
  $f2();
};
$f1();
?>

所有这些都在这里描述

所以我的问题来了。为什么 PHP 中的闭包必须是 lambda 函数?在 JavaScript 中,每个函数都是一个闭包,但不一定是 lambda 函数。那么为什么我们不能在 PHP 中执行以下操作呢?

$foo = 'hello';
function closure() use ($foo) { echo $foo; } // PHP reports a syntax error here
closure();

(致命错误:语法错误,意外的 T_USE,需要 ';' 或 '{')

4

0 回答 0