PHP create_function() вместо простого использования eval()
-
03-07-2019 - |
Вопрос
В PHP у вас есть функция create_function(), которая создает лямбда-функцию с уникальным именем, например:
$myFunction = create_function('$foo', 'return $foo;');
$myFunction('bar'); //Returns bar
Действительно ли это лучше (кроме того, что проще), чем просто:
do{
$myFunction = 'createdFunction_'.rand();
}
while(function_exists($myFunction));
eval("function $myFunction(\$foo) { return \$foo; }");
$myFunction('bar'); //Returns bar
Create_function действительно лучше?(кроме того, что это проще)
Решение
Насколько я понимаю из соответствующей документации, [1] они оба делают одно и то же, create_function() просто предлагает вам уникальное имя функции.
Чтобы ответить на некоторые другие комментарии по этому вопросу:
create_function можно присвоить переменной, что сделает функцию доступной для других частей вашего кода, тогда как eval полезен только для заданной области.
Вполне может быть, что eval () работает в текущей области, но определения функций в любом случае сбрасываются в глобальное пространство имен. [2] Поэтому всякий раз, когда вы определяете функцию, она будет доступна повсюду в вашей программе.
Использование eval() загромождает список глобальных функций, а create_function() — нет.
create_function() возвращает только строку с именем новой функции[3], а не какой-то специальный тип обратного вызова.Таким образом, оба метода загрязнят ваше глобальное пространство имен.
Так что нет, кроме того, что create_function() проще, он не выглядит лучше, чем eval().
Сноски:
[1] http://au2.php.net/manual/en/functions.user-defined.php ; http://au.php.net/create_function ; http://au.php.net/eval
Другие советы
Использование eval () загромождает глобальный список функций, create_function () - нет, кроме того, что нет большой разницы. Однако , оба метода требуют записи тела функции внутри строки PHP, которая подвержена ошибкам, и если бы вы работали над моим проектом, я бы приказал вам просто объявить вспомогательную функцию с использованием обычного синтаксиса. р>
Анонимные функции в PHP реализованы настолько плохо, что вашему коду лучше не их использовать. (К счастью, это будет исправлено в PHP 5.3).
Лично я обнаружил, что create_function () очень удобен при сортировке массивов.
На самом деле, я только что искал в Интернете, и похоже, что документация PHP имеет хороший пример этого.
http://us.php.net/create_function
Прокрутите вниз до Пример # 3. Использование анонимных функций в качестве функций обратного вызова .
create_function
может быть назначен переменной, делающей функцию доступной для других частей вашего кода, тогда как eval
полезна только для данной области.
(кроме того, что это проще)
Я не понимаю, как вы можете так легко отрицать это. Учитывая ваши два примера, что легче понять с первого взгляда? Функция Create_function сообщает вам, что вы намерены выполнить. Эвал этого не делает.