create_function Создаёт функцию динамически, оценивая строку кода &warn.deprecated.function-7-2-0.removed-8-0-0; &reftitle.description; stringcreate_function stringargs stringcode Создаёт функцию динамически из переданных параметров и возвращает её уникальное имя. Функция внутри себя делает вызов функции eval, а значит имеет такие же проблемы с безопасностью, как и eval. Также у неё плохие характеристики производительности и использования памяти, поскольку созданные функции являются глобальными и не могут быть освобождены. Используйте анонимные функции. &reftitle.parameters; Обычно рекомендуется передавать параметры в виде строк с одинарной кавычкой. При использовании строк с двойной кавычкой имена переменных в коде должны быть тщательно экранированы, например, вот так: \$somevar. args Аргументы функции в виде строки, разделённой запятыми. code Код функции. &reftitle.returnvalues; Возвращает уникальное имя функции в виде строки&return.falseforfailure;. Обратите внимание, что имя содержит непечатаемый символ ("\0"), поэтому следует соблюдать осторожность при печати имени или включении его в любую другую строку. &reftitle.examples; Создание функции динамически с помощью <function>create_function</function> или анонимных функций Вы можете использовать динамически созданную функцию, чтобы, например, создать функцию на основе информации, собранной во время выполнения. Во-первых, используя функцию create_function: ]]> Теперь тот же код, используя анонимную функцию; обратите внимание, что код и аргументы больше не содержатся в строках: ]]> &example.outputs; Создание общей функции-обработчика с помощью <function>create_function</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; Анонимные функции