Замыкания в PHP 5.3.0
В PHP 5.3.0 будут замыкания. Бог ты мой! Не прошло и 15 лет! Надеюсь, это будут действительно анонимные функции, хотя возможность замыкания сама по себе тоже значительное событие.
Напомню как сейчас обстоит дело в PHP с «анонимными» функциями. Сделаны они хаком, поэтому я их взял в кавычки. Каждый раз, когда вы вызываете create_function PHP создаёт функцию (в глобальной зоне видимости, других нет) «\0lambda_N», где N — номер по внутреннему счётчику PHP, а «\0» — символ с кодом ноль, чтобы пользователь не смог самостоятельно создать «анонимную» функцию с произвольным номером, иначе пришлось бы просматривать все фукции с определённым префиксом и искать в нём «дыры» в номерах.
В частности, это значит, что все «анонимные» функции доступны в глобальной зоне видимости и всегда берут оттуда «свежую» копию переменной, а не то значение, которое было на момент её создания (т. е. замыкания нет), самое же мерзкое, с моей точки зрения, что анонимными функциям сложно нормально пользоваться: в цикле их легко нашлёпать столько, сколько раз вызовется цикл, а вставив её в метод, получить столько функций, сколько раз вызван этот метод.
От последнего эффекта можно избавиться, используя статические переменный, но это варварский способ, да и многие программисты (даже среднего уровня) не подозревают об этих особенностях.
От замыканий в JavaScript отличается тем, что дополнительно использует инструкцию use(), которая определяет, какие переменные, существующие в том контексте, где создана лямбда-функция, доступны внутри самой функции. А я думал, как же они разрулят тот факт, что глобальные переменные в PHP глобальны только если это явно указано.
Комментарий для morozov.livejournal.com:
Я прочитал статью, ага :)
это будут действительно анонимные функции
Комментарий для jimidini.ya.ru:
Нет, это будут объекты ( http://bolknote.ru/all/1794 ).
Комментарий для Евгения Степанищева:
я знаю (я участвовал в обсуждении функционала, когда это всё планировалось). но это всего-лишь деталь реализации :)
главное: для конечного пользователя это совершенно полноценные лямбда-функции
Комментарий для jimidini.ya.ru:
Вижу :) Радуюсь :)
Ты учавствуешь в разработке PHP?
Опечатался в слове «участвуешь», ну да ладно.
Комментарий для Евгения Степанищева:
с некоторых пор. ага
Комментарий для jimidini.ya.ru:
Круто. А все те вкусные вещи, которые мы все видим, они уже не войдут в PHP 5.3, да? (taint variables, например)
Комментарий для Евгения Степанищева:
taint variables не войдут
по сути, набор того что войдёт в 5.3 уже определён и шанс на то, что что-то успеет просочиться за 2 оставшихся до «заморозки» дня стремится к нулю.
те же closures были под вопросом очень долго. многие были за то, чтобы отложить их до 5.4
Комментарий для jimidini.ya.ru:
Спасибо тем, кто решил, что откладывать это не нужно. Радует, что PHP двигается в правильном направлении! :)
Ещё бы для taint сделали E_ERROR дефолтным уровнем.
Комментарий для Евгения Степанищева:
taint пока не являются частью php. напиши автору :)
Комментарий для jimidini.ya.ru:
Okay :)