Closures в PHP: подробности

Внимательно прочитав документ по замыканиям в PHP, я вынес для себя следующее. Патч работает очень просто и довольно изящно. Замыкания — это не какой-то новый базовый тип, а экземпляр класса Closure. Причём, для того, чтобы объект вёл себя как функция, вводится новый «магический» метод __invoke:

class Example {
  public function __invoke () {
    echo "Hello World!\n";
  }
}
$foo = new Example;
$foo ();

Слово «use», которое появилось в полной версии создания функции — это, конечно, уже полностью новый синтаксис, а не просто косметические изменения. Для тех, кто не прочитал документ, поясняю, что анонимная функция может быть создана, например, так:

function getAdder($x) {
   return function ($y) use ($x) {
     // or: lexical $x;
     return $x + $y;
   }
 }

«Use» вытекает из идеологии PHP, где глобальные переменные не видны сразу внутри функции, а определяются программистом (тоже хаком, кстати). «Use» именно «доставляет» переменную. Причём не из глобального уровня, а с родительского уровня. Что (ура) реализует мою давнюю мечту об изоляции переменных.

Читайте также

Figlet_example.phps
* Text_Figlet example script. * Renders «Hello, world!» using slant.flf font
2004

Комментарии 13

zorgg.blogspot.com № 1
Замыкания в PHP, эээх.

Я думаю, в один прекрасный день, ты откроешь для себя либо C++, либо какой-нибудь FPL. Чур на копрофагус не посылать.
david-m.livejournal.com № 2
А что там за новое слово “lexical”?
jimidini (jimidini.ya.ru) № 3
lexical отменили
david-m.livejournal.com № 8
Там в статье как-то очень тщательно выдерживается coding style… поэтому я лучше тут спрошу: а можно будет делать сразу

preg_replace_callback ('/( +) /', function($a) {…}, $text)

?
FX Poster (blog.fxposter.org) № 9
Комментарий для david-m.livejournal.com:

Да.

Input:
$array = array(1, 2, 3);
$array = array_map(function($v) { return $v * $v; }, $array);
var_dump($array);

Output:

array(3) {
[0]=>
int(1)
[1]=>
int(4)
[2]=>
int(9)
}