Функции закрытия PHP: почему замыкание должно быть анонимной функцией?
Лямбда или анонимная функция - это просто функция без имени.
например
$lambda = function($a, $b) { echo $a + $b; };
Закрытие - это функция, которая имеет доступ к переменным, не указанным в списке параметров. В PHP 5.3+ эти переменные указываются после ключевого слова use и связаны либо по значению, либо по ссылке во время выполнения определения функции функции замыкания.
например
$foo = 'hello';
$closure = function() use ($foo) { echo $foo; };
$closure();
В JavaScript все функции являются замыканиями в том смысле, что, когда функции вложены, существует цепочка областей действия, тогда как, например, самая внутренняя функция имеет доступ к 1. своим локальным переменным, 2. локальным переменным функции во внешней области, известной как 3. его область закрытия, 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 должны быть лямбда-функциями? В JavaScript каждая функция является замыканием, но не обязательно должна быть лямбда-функцией. Так почему же мы не можем сделать следующее в PHP?:
$foo = 'hello';
function closure() use ($foo) { echo $foo; } // PHP reports a syntax error here
closure();
(Неустранимая ошибка: синтаксическая ошибка, неожиданное T_USE, ожидание ';' или '{')