Реальное закрытие в PHP <5.3

Есть ли способ написать реальные закрытия в PHP для языковых версий старше 5.3 (как 5.3 добавил ключевое слово use для анонимных функций)?

Я PHP 5.3+ могу написать:

function make_adder($x) {
    return function($to) use ($x) {
        return $to + $x;
    };
}
$add5 = make_adder(5);
$add5(100); # => 105

Как я могу использовать эти шаблоны для определения функций внутри функций, а внутренние функции имеют доступ к внешним переменным функции?

3
добавлено
Просмотры: 2
nl ja de

2 ответы

В этом простом случае будет работать следующее:

function make_adder($x) {
    return create_function('$to', 'return '.var_export($x, true).' + $to;');
}
$add5 = make_adder(5);
$add5(100); # => 105

Но это не закрытие в строгом смысле этого слова.

5
добавлено
Умное использование var_export там! :-D
добавлено автор Rocket Hazmat, источник
Хорошо, это работает ... но это побеждает целую цель закрытия: чистый и читаемый код (представьте себе, что это для нескольких 10-строчных функций ...) :(
добавлено автор NeuronQ, источник
... хотя он может использоваться в скрипте для автоматического резервного копирования с 5.3 по 5.2 кода
добавлено автор NeuronQ, источник
@NeuronQ: хотя есть некоторые применения закрытий, которые невозможно сделать с помощью этого метода, так что скрипт должен был бы быть в состоянии сказать.
добавлено автор newacct, источник
Вы попросили решение в PHP <5.3. Нет эквивалента анонимных функций, кроме create_function() .
добавлено автор Stefan Gehrig, источник

Простой ответ. То, о чем вы просите, не может быть сделано в версиях PHP старше 5.3. Извините, но функциональность просто недоступна. Никаких полезных обходов нет (помимо использования глобальных переменных, конечно).

Однако, если вы используете версию PHP старше 5.3, я бы strong советовал вам обновить.

5.2 был объявлен конец жизни два года назад и с тех пор имеет нулевые исправления или исправления безопасности - он не поддерживается и небезопасен.

Кроме того, отсутствие поддержки также распространяется на операционные системы. Для большинства серверных операционных систем установщики для 5.2 и более ранних версий не существуют для текущих версий ОС. Это означает, что если вы используете PHP 5.2, это означает, что вы, вероятно, также будете работать с устаревшей версией ОС. Это также имеет последствия для безопасности.

Ни один системный администратор, заслуживающий его оплаты, не позволит своей сети запускать незащищенное программное обеспечение в общедоступной системе, поэтому, если вы еще не обновили его, вам действительно нужно сделать это сейчас.

Если вы используете веб-хостинговую компанию, которая не обновилась, вам следует подумать о том, чтобы перевести свой бизнес в компанию, которая заботится о безопасности своей сети.

0
добавлено
Вопрос никогда не говорил ничего о необходимости разместить его где угодно или что-то еще. Это всего лишь вопрос о языке.
добавлено автор newacct, источник