В конце 2007 года был предложен патч, добавляющий лямбда функций (но без замыканий) для PHP. В ходе дискуссии в списке рассылки, было решено, что без поддержки замыканий, нет необходимости добавлять их в PHP.
Тем не менее, интерес к этой теме привел к существенным изменением первоначального патча Кристиана Сайлера (Christian Seiler) и выпуску Дмитрием Стоговым (Dmitry Stogov) нового патча.
Источники:
Upd: Узнать больше о пользе этих нововведений можно в документации к таким языкам как Erlang, ECMAScript, Ruby
Реализовать подобный функционал можно было и раньше, это просто «синтаксический сахар»
Тем не менее, интерес к этой теме привел к существенным изменением первоначального патча Кристиана Сайлера (Christian Seiler) и выпуску Дмитрием Стоговым (Dmitry Stogov) нового патча.
В результате мы имеем замыкание и лямбда функции в PHP (5.3)
function getAdder($x) {
return function ($y) use ($x) {
// or: lexical $x;
return $x + $y;
};
}
//---- OOP
class Example {
private $search;
public function __construct ($search) {
$this->search = $search;
}
public function setSearch ($search) {
$this->search = $search;
}
public function getReplacer ($replacement) {
return function ($text) use ($replacement) {
return str_replace ($this->search, $replacement, $text);
};
}
}
$example = new Example ('hello');
$replacer = $example->getReplacer ('goodbye');
echo $replacer ('hello world'); // goodbye world
$example->setSearch ('world');
echo $replacer ('hello world'); // hello goodbye
class Example {
public function __invoke () {
echo «Hello World!\n»;
}
}
$foo = new Example;
$foo ();
//--- Reflection
class Example {
static function printer () { echo «Hello World!\n»; }
}
$class = new ReflectionClass ('Example');
$method = $class->getMethod ('printer');
$closure = $method->getClosure ();
$closure ();* This source code was highlighted with Source Code Highlighter.
Ждем с нетерпением выхода PHP 5.3
Источники:
Upd: Узнать больше о пользе этих нововведений можно в документации к таким языкам как Erlang, ECMAScript, Ruby
Реализовать подобный функционал можно было и раньше, это просто «синтаксический сахар»