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

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

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

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

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

morozov.livejournal.com (morozov.livejournal.com)
22 июля 2008, 14:06

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

bolk (bolknote.ru)
22 июля 2008, 14:07, ответ предназначен morozov.livejournal.com:

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

jimidini (jimidini.ya.ru)
22 июля 2008, 14:22

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

bolk (bolknote.ru)
22 июля 2008, 14:26, ответ предназначен jimidini (jimidini.ya.ru):

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

jimidini (jimidini.ya.ru)
22 июля 2008, 15:30, ответ предназначен bolk (bolknote.ru):

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

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

bolk (bolknote.ru)
22 июля 2008, 17:10, ответ предназначен jimidini (jimidini.ya.ru):

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

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

bolk (bolknote.ru)
22 июля 2008, 17:20

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

jimidini (jimidini.ya.ru)
22 июля 2008, 17:26, ответ предназначен bolk (bolknote.ru):

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

bolk (bolknote.ru)
22 июля 2008, 17:58, ответ предназначен jimidini (jimidini.ya.ru):

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

jimidini (jimidini.ya.ru)
22 июля 2008, 18:51, ответ предназначен bolk (bolknote.ru):

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

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

bolk (bolknote.ru)
22 июля 2008, 20:39, ответ предназначен jimidini (jimidini.ya.ru):

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

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

jimidini (jimidini.ya.ru)
23 июля 2008, 11:45, ответ предназначен bolk (bolknote.ru):

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

bolk (bolknote.ru)
23 июля 2008, 16:38, ответ предназначен jimidini (jimidini.ya.ru):

Okay :)

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

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