PHP闭包函数:为什么闭包必须是匿名函数?

时间:2014-10-28 17:29:33

标签: javascript php closures lexical-closures php-closures

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

e.g。

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

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

e.g。

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

在JavaScript中,所有函数都是闭包时的意义 函数是嵌套的,例如存在范围链 最里面的函数可以访问1.它的局部变量,2 函数的局部变量在其封闭范围内称为 封闭范围,3。封闭范围的局部变量 封闭范围,称为封闭范围的封闭范围, ......等等,直到我们也可以访问N.全局变量 它们在最顶层的范围内定义。用变量声明的变量 最内层范围中的var将掩盖外部范围中的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();
?>

所有这些都是described here

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

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

(致命错误:语法错误,意外T_USE,期待&#39 ;;&#39;或&#39; {&#39;)

0 个答案:

没有答案