Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Замыкания в PHP 5.3.0

В PHP 5.3.0 будут замыкания. Бог ты мой! Не прошло и 15 лет! Надеюсь, это будут действительно анонимные функции, хотя возможность замыкания сама по себе тоже значительное событие.

Напомню как сейчас обстоит дело в PHP с «анонимными» функциями. Сделаны они хаком, поэтому я их взял в кавычки. Каждый раз, когда вы вызываете create_function PHP создаёт функцию (в глобальной зоне видимости, других нет) «\0lambda_N», где N — номер по внутреннему счётчику PHP, а «\0» — символ с кодом ноль, чтобы пользователь не смог самостоятельно создать «анонимную» функцию с произвольным номером, иначе пришлось бы просматривать все фукции с определённым префиксом и искать в нём «дыры» в номерах.

В частности, это значит, что все «анонимные» функции доступны в глобальной зоне видимости и всегда берут оттуда «свежую» копию переменной, а не то значение, которое было на момент её создания (т. е. замыкания нет), самое же мерзкое, с моей точки зрения, что анонимными функциям сложно нормально пользоваться: в цикле их легко нашлёпать столько, сколько раз вызовется цикл, а вставив её в метод, получить столько функций, сколько раз вызван этот метод.

От последнего эффекта можно избавиться, используя статические переменный, но это варварский способ, да и многие программисты (даже среднего уровня) не подозревают об этих особенностях.

13 комментариев
morozov.livejournal.com 2008

От замыканий в JavaScript отличается тем, что дополнительно использует инструкцию use(), которая определяет, какие переменные, существующие в том контексте, где создана лямбда-функция, доступны внутри самой функции. А я думал, как же они разрулят тот факт, что глобальные переменные в PHP глобальны только если это явно указано.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для morozov.livejournal.com:

Я прочитал статью, ага :)

jimidini (jimidini.ya.ru) 2008

это будут действительно анонимные функции

Евгений Степанищев (bolknote.ru) 2008

Комментарий для jimidini.ya.ru:

Нет, это будут объекты ( http://bolknote.ru/all/1794 ).

jimidini (jimidini.ya.ru) 2008

Комментарий для Евгения Степанищева:

я знаю (я участвовал в обсуждении функционала, когда это всё планировалось). но это всего-лишь деталь реализации :)

главное: для конечного пользователя это совершенно полноценные лямбда-функции

Евгений Степанищев (bolknote.ru) 2008

Комментарий для jimidini.ya.ru:

Вижу :) Радуюсь :)

Ты учавствуешь в разработке PHP?

Евгений Степанищев (bolknote.ru) 2008

Опечатался в слове «участвуешь», ну да ладно.

jimidini (jimidini.ya.ru) 2008

Комментарий для Евгения Степанищева:

с некоторых пор. ага

Евгений Степанищев (bolknote.ru) 2008

Комментарий для jimidini.ya.ru:

Круто. А все те вкусные вещи, которые мы все видим, они уже не войдут в PHP 5.3, да? (taint variables, например)

jimidini (jimidini.ya.ru) 2008

Комментарий для Евгения Степанищева:

taint variables не войдут
по сути, набор того что войдёт в 5.3 уже определён и шанс на то, что что-то успеет просочиться за 2 оставшихся до «заморозки» дня стремится к нулю.

те же closures были под вопросом очень долго. многие были за то, чтобы отложить их до 5.4

Евгений Степанищев (bolknote.ru) 2008

Комментарий для jimidini.ya.ru:

Спасибо тем, кто решил, что откладывать это не нужно. Радует, что PHP двигается в правильном направлении! :)

Ещё бы для taint сделали E_ERROR дефолтным уровнем.

jimidini (jimidini.ya.ru) 2008

Комментарий для Евгения Степанищева:

taint пока не являются частью php. напиши автору :)

Евгений Степанищев (bolknote.ru) 2008

Комментарий для jimidini.ya.ru:

Okay :)