Замыкания в PHP 5.3.0
В PHP 5.3.0 будут замыкания. Бог ты мой! Не прошло и 15 лет! Надеюсь, это будут действительно анонимные функции, хотя возможность замыкания сама по себе тоже значительное событие.
Напомню как сейчас обстоит дело в PHP с «анонимными» функциями. Сделаны они хаком, поэтому я их взял в кавычки. Каждый раз, когда вы вызываете create_function PHP создаёт функцию (в глобальной зоне видимости, других нет) «\0lambda_N», где N — номер по внутреннему счётчику PHP, а «\0» — символ с кодом ноль, чтобы пользователь не смог самостоятельно создать «анонимную» функцию с произвольным номером, иначе пришлось бы просматривать все фукции с определённым префиксом и искать в нём «дыры» в номерах.
В частности, это значит, что все «анонимные» функции доступны в глобальной зоне видимости и всегда берут оттуда «свежую» копию переменной, а не то значение, которое было на момент её создания (т. е. замыкания нет), самое же мерзкое, с моей точки зрения, что анонимными функциям сложно нормально пользоваться: в цикле их легко нашлёпать столько, сколько раз вызовется цикл, а вставив её в метод, получить столько функций, сколько раз вызван этот метод.
От последнего эффекта можно избавиться, используя статические переменный, но это варварский способ, да и многие программисты (даже среднего уровня) не подозревают об этих особенностях.
Closures в PHP: подробности
Внимательно прочитав документ по замыканиям в PHP, я вынес для себя следующее. Патч работает очень просто и довольно изящно. Замыкания — это
class Example {
public function __invoke () {
echo "Hello World!\n";
}
}
$foo = new Example;
$foo ();Слово «use», которое появилось в полной версии создания функции — это, конечно, уже полностью новый синтаксис, а не просто косметические изменения. Для тех, кто не прочитал документ, поясняю, что анонимная функция может быть создана, например, так:
function getAdder($x) {
return function ($y) use ($x) {
// or: lexical $x;
return $x + $y;
}
}«Use» вытекает из идеологии PHP, где глобальные переменные не видны сразу внутри функции, а определяются программистом (тоже хаком, кстати). «Use» именно «доставляет» переменную. Причём не из глобального уровня, а с родительского уровня. Что (ура) реализует мою давнюю мечту об изоляции переменных.
Верх наивности или маразма
C iBasg:
Что такое верх наивности?
Мне 24. Я Одмин и живу с родителями. Соровождаю 3 предприятия, из которых на 2 есть безлимитный интернет. Дома кроме «общего» компа есть мой личный,
и 2-х мегабитная безлимитка с внешним IP адресом для Осла и Торрента. Я лично знаком с крупнейшим видеопиратом своего города.Верх наивности — это после установки родителями спутникого ТВ дома, запаролить порноканалы =)))
24 года парню. Родители ставят на порноканалы пароль. Зачем?!