Реальное закрытие в 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
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, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp

ФП
ФП
179 участник(ов)

Все о функциональных языках