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

22.07.2008, Nº 1793



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

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

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

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

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



22.07.2008, Nº 1793

#1 morozov.livejournal.com 22.07.2008, 15:06

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

#2 bolk @bolknote.ru22.07.2008, 15:07 ответил morozov.livejournal.com

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

#3 jimidini @jimidini.ya.ru22.07.2008, 15:22

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

#4 bolk @bolknote.ru22.07.2008, 15:26 ответил jimidini.ya.ru

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

#5 jimidini @jimidini.ya.ru22.07.2008, 16:30 ответил bolknote.ru

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

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

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

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

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

#7 bolk @bolknote.ru22.07.2008, 18:20

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

#8 jimidini @jimidini.ya.ru22.07.2008, 18:26 ответил bolknote.ru

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

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

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

#10 jimidini @jimidini.ya.ru22.07.2008, 19:51 ответил bolknote.ru

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

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

#11 bolk @bolknote.ru22.07.2008, 21:39 ответил jimidini.ya.ru

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

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

#12 jimidini @jimidini.ya.ru23.07.2008, 12:45 ответил bolknote.ru

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

#13 bolk @bolknote.ru23.07.2008, 17:38 ответил jimidini.ya.ru

Okay :)
Ваше имя или адрес блога:

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


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


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