Я читал о новых функциях PHP 5.3, и одной из основных функций является закрытие .
Если я не ошибаюсь, разработчики PHP:
а) путаные замыкания с анонимными функциями
б) блокировки нарушаются в PHP 5.3.1, в которых я тестирую
Из того, что википедия говорит, что закрытие – это механизм анонимных функций плюс привязка переменных сферы родительской функции к области действия. Последняя часть кажется разбитой в PHP.
Я проверил ошибки PHP, и ничего не нашел об этом, как ни странно.
Вот как я тестирую:
<?php function getFun() { $x = 2; return function() { return $x; }; } $f = getFun(); // getFun()(); doesn't work -.- var_dump($f()); // $f() == null
В языках, на самом деле реализующих закрытие, он возвращает 2:
def f(): x = 2 return lambda: x print(f()()) # prints 2
а также
alert((function() { var x = 2; return function() { return x; }; })()()); // alerts 2
Итак, я ошибаюсь или?
переменные, унаследованные от внешней области, должны быть указаны явно. из руководства:
public function getTotal($tax) { $total = 0.00; $callback = function ($quantity, $product) use ($tax, &$total) ...
Внедрение закрытия PHP немного отличается от того, что вы можете ожидать, если используете JavaScript. Просто вызывающая function () { return x; }
function () { return x; }
не будет работать, так как вы должны use
инструкцию use
.