Евгений Степанищев

Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Okay :)

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

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

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

Подсказка по написанию комментария

В комментариях можно применять следующую специальную разметку:

  • слово, обрамлённое в «звёздочки» выделяется *жирным*
  • ссылка становится ссылкой: http://bolknote.ru
  • ссылка в скобках также становится ссылкой, закрывающая скобка не захватывается: (http://bolknote.ru)
  • каждую строку цитаты следует начинать со знака «больше»:
    > это цитата
    > из двух строк
  • можно вставить картинку, залитую на один из сервисов: «Яндекс.Фотки», «Фликр» или «Пикплз». Для этого нужно вставить на страницу полный адрес вашей картинки на сервисе, он превратится в картинку:

    http://fotki.yandex.ru/users/bolknote/view/274311?page=3