PHP create_function () и просто использование eval () - PullRequest
4 голосов
/ 07 января 2009

В 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 лучше? (кроме того, что это проще)

Ответы [ 5 ]

6 голосов
/ 07 января 2009

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

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

5 голосов
/ 13 марта 2009

Насколько я понимаю соответствующие документы, [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

3 голосов
/ 07 января 2009

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

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

http://us.php.net/create_function

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

2 голосов
/ 07 января 2009

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

0 голосов
/ 07 января 2009

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

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

...