PHP create_function() вместо простого использования eval()

StackOverflow https://stackoverflow.com/questions/418674

  •  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

[2] http://au2.php.net/manual/en/functions.user-defined.php

[3] http://au.php.net/create_function

Другие советы

Использование eval () загромождает глобальный список функций, create_function () - нет, кроме того, что нет большой разницы. Однако , оба метода требуют записи тела функции внутри строки PHP, которая подвержена ошибкам, и если бы вы работали над моим проектом, я бы приказал вам просто объявить вспомогательную функцию с использованием обычного синтаксиса.

Анонимные функции в PHP реализованы настолько плохо, что вашему коду лучше не их использовать. (К счастью, это будет исправлено в PHP 5.3).

Лично я обнаружил, что create_function () очень удобен при сортировке массивов.

На самом деле, я только что искал в Интернете, и похоже, что документация PHP имеет хороший пример этого.

http://us.php.net/create_function

Прокрутите вниз до Пример # 3. Использование анонимных функций в качестве функций обратного вызова .

create_function может быть назначен переменной, делающей функцию доступной для других частей вашего кода, тогда как eval полезна только для данной области.

(кроме того, что это проще)

Я не понимаю, как вы можете так легко отрицать это. Учитывая ваши два примера, что легче понять с первого взгляда? Функция Create_function сообщает вам, что вы намерены выполнить. Эвал этого не делает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top