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

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


person Pim Jager    schedule 06.01.2009    source источник


Ответы (5)


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

person Community    schedule 13.03.2009

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

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

person too much php    schedule 07.01.2009
comment
Мне нравится синтаксис JS function() {, именно так я наткнулся на это, пытаясь найти что-то подобное в PHP. - person Pim Jager; 07.01.2009
comment
Это отстой по сравнению с реализацией JS и, насколько я помню, довольно медленно. - person alex; 08.01.2009

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

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

http://us.php.net/create_function

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

person Salty    schedule 06.01.2009

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

person dreamlax    schedule 07.01.2009
comment
Это неправильно. Попробуйте создать функцию с eval внутри функции. Вы также сможете вызывать его вне функции. function a() { eval('function b(){echo hi\n;}'); } а(); б(); - person soulmerge; 13.03.2009

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

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

person jmucchiello    schedule 07.01.2009
comment
В основном потому, что я хотел знать, есть ли другие PRO. - person Pim Jager; 07.01.2009