create_functionСоздаёт функцию динамически, оценивая строку кода
&warn.deprecated.function-7-2-0.removed-8-0-0;
&reftitle.description;
stringcreate_functionstringargsstringcode
Создаёт функцию динамически из переданных параметров
и возвращает её уникальное имя.
Функция внутри себя делает вызов функции eval, а значит
имеет такие же проблемы с безопасностью, как и eval.
Также у неё плохие характеристики производительности и использования памяти,
поскольку созданные функции являются глобальными и не могут быть освобождены.
Используйте
анонимные функции.
&reftitle.parameters;
Обычно рекомендуется передавать параметры в виде строк
с одинарной кавычкой.
При использовании строк с двойной кавычкой
имена переменных в коде должны быть тщательно экранированы,
например, вот так: \$somevar.
args
Аргументы функции в виде строки, разделённой запятыми.
code
Код функции.
&reftitle.returnvalues;
Возвращает уникальное имя функции в виде строки&return.falseforfailure;.
Обратите внимание, что имя содержит непечатаемый символ ("\0"),
поэтому следует соблюдать осторожность при печати имени или включении его в любую другую строку.
&reftitle.examples;
Создание функции динамически с помощью create_function или анонимных функций
Вы можете использовать динамически созданную функцию, чтобы, например,
создать функцию на основе информации, собранной во время выполнения.
Во-первых, используя функцию create_function:
]]>
Теперь тот же код, используя анонимную функцию;
обратите внимание, что код и аргументы больше не содержатся в строках:
]]>
&example.outputs;
Создание общей функции-обработчика с помощью create_function или анонимных функций
Другим вариантом использования может быть общая функция-обработчик,
которая может применять набор операций к списку параметров:
=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}'),
create_function('$a,$b', "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);"),
create_function('$a,$b', 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }')
);
echo "\nИспользование первого массива динамических функций\n";
echo "Параметры: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// теперь создаём кучу функций обработки строк
$garr = array(
create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
'и \"$b\"\n** для меня одинаковы! (смотря по первым 3 символам)";'),
create_function('$a,$b', 'return "CRCs: " . crc32($a) . ", ".crc32($b);'),
create_function('$a,$b', 'return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)";')
);
echo "\nИспользование второго массива динамических функций\n";
process("Варкалось. Хливкие шорьки пырялись по наве", "Варан ползёт", $garr);
?>
]]>
И снова, тот же самый код с использованием анонимных функций.
Обратите внимание, что имена переменных в коде больше не нужно экранировать,
поскольку они не заключены в строку.
=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;} },
function($a,$b) { return "min(b^2+a, a^2,b) = " . min($a*$a+$b, $b*$b+$a); },
function($a,$b) { if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; } }
);
echo "\nИспользование первого массива динамических функций\n";
echo "Параметры: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// теперь создаём кучу функций обработки строк
$garr = array(
function($b,$a) { if (strncmp($a, $b, 3) == 0) return "** \"$a\" " .
"и \"$b\"\n** для меня одинаковы! (смотря по первым 3 символам)"; },
function($a,$b) { return "CRCs: " . crc32($a) . ", ".crc32($b); },
function($a,$b) { return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)"; }
);
echo "\nИспользование второго массива динамических функций\n";
process("Варкалось. Хливкие шорьки пырялись по наве", "Варан ползёт", $garr);
?>
]]>
&example.outputs;
Использование динамических функций в качестве callback-функций
Возможно, самым распространённым использованием динамических функций
является передача их в качестве callback-функций, например,
при использовании array_walk или usort.
]]>
Преобразование приведённого выше кода в анонимную функцию:
]]>
&example.outputs;
о, манго
[1] => эх, манго
[2] => то манго
[3] => это манго
)
]]>
Сортировка строк от самой длинной до самой короткой с помощью create_function:
]]>
Преобразование приведённого выше кода в анонимную функцию:
]]>
&example.outputs;
мало
[1] => много
[2] => большая строка
[3] => строка строка строка
)
Отсортированный:
Array
(
[0] => строка строка строка
[1] => большая строка
[2] => много
[3] => мало
)
]]>
&reftitle.seealso;
Анонимные функции