Блог Обо мне Храню Читаю Ем 99  

22.07.2008, Nº 1794



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» именно «доставляет» переменную. Причём не из глобального уровня, а с родительского уровня. Что (ура) реализует мою давнюю мечту об изоляции переменных.
22.07 15:07
22.07 15:07



22.07.2008, Nº 1794

#1 zorgg.blogspot.com 22.07.2008, 16:44

Замыкания в PHP, эээх.

Я думаю, в один прекрасный день, ты откроешь для себя либо C++, либо какой-нибудь FPL. Чур на копрофагус не посылать.

#2 david-m.livejournal.com 22.07.2008, 17:17

А что там за новое слово “lexical”?

#3 jimidini @jimidini.ya.ru22.07.2008, 17:43 ответил david-m.livejournal.com

lexical отменили

#4 bolk @bolknote.ru22.07.2008, 18:09 ответил zorgg.blogspot.com

C++? Я его для себя закрыл. Лучше ты открой для себя что-то более гармоничное. Objective C, например.

#5 bolk @bolknote.ru22.07.2008, 18:09 ответил jimidini.ya.ru

Нет его :) Это из примеров кода копипастом попало :)

#6 FX Poster @blog.fxposter.org22.07.2008, 22:57

Гм. return function? В PHP 5.3 функции - это обьекты? :)

#7 FX Poster @blog.fxposter.org22.07.2008, 23:10

Только что проверил - да, так и есть:

Input:
$lambda = function () { echo "Hello World!\n"; };
var_dump($lambda);

Output:
object(Closure)#1 (0) {
}

#8 david-m.livejournal.com 22.07.2008, 23:23 ответил jimidini.ya.ru

Там в статье как-то очень тщательно выдерживается coding style… поэтому я лучше тут спрошу: а можно будет делать сразу

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

?

#9 FX Poster @blog.fxposter.org22.07.2008, 23:37 ответил 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)
}

#10 david-m.livejournal.com 22.07.2008, 23:55 ответил blog.fxposter.org

Спасибо! Это радует.

#11 bolk @bolknote.ru23.07.2008, 09:49 ответил blog.fxposter.org

Чего проверять-то? Из статьи это следует :)

#12 david-m.livejournal.com 23.07.2008, 15:14 ответил bolknote.ru

Я как-то привык перепроверять «очевидное» в php:)

#13 bolk @bolknote.ru24.07.2008, 00:08 ответил david-m.livejournal.com

Это не очевидное, всё это прямо упоминается в статье )
Ваше имя или адрес блога:

Текст комментария (для гиков: не HTML, а текст!)


Кому бы вы хотели ответить (или кликните на его аватару)


Евгений Степанищев (imbolk@gmail.com)
t=0.038