create_function
Эта функция была DEPRECATED в РНР 7.2.0 и REMOVED в РНР 8.0.0. Полагаться на эту функцию крайне не рекомендуется.
Description
create_function(string $args, string $code): string
Создает функцию динамически из переданных параметров и возвращает для нее уникальное имя.
Эта функция внутренне выполняет eval() и поэтому имеет те же проблемы с безопасностью, что и eval() . Он также имеет плохие характеристики производительности и использования памяти, поскольку созданные функции являются глобальными и не могут быть освобождены.
Вместо этого следует использовать собственную анонимную функцию .
Parameters
Обычно рекомендуется передавать эти параметры как строки в одинарных кавычках . При использовании строк в двойных кавычках имена переменных в коде необходимо тщательно экранировать, например, \$somevar .
Аргументы функции в виде строки,разделенной запятыми.
Return Values
Возвращает уникальное имя функции в виде строки или false в случае ошибки. Обратите внимание, что имя содержит непечатаемый символ ( «\0» ), поэтому следует соблюдать осторожность при печати имени или включении его в любую другую строку.
Examples
Пример #1 Динамическое создание функции с помощью create_function() или анонимных функций
Вы можете использовать динамически созданную функцию, чтобы (например) создать функцию на основе информации, собранной во время выполнения. Во- первых, используя create_function() :
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);'); echo $newfunc(2, M_E) . "\n"; ?>
Теперь тот же код с использованием анонимной функции ; обратите внимание, что код и аргументы больше не содержатся в строках:
$newfunc = function($a,$b) < return "ln($a) + ln($b) = " . log($a * $b); >; echo $newfunc(2, M_E) . "\n"; ?>
Выводится приведенный выше пример:
ln(2) + ln(2.718281828459) = 1.6931471805599
Пример #2 Создание общей функции обработки с помощью create_function() или анонимных функций
Другим вариантом использования может быть общая функция-обработчик,которая может применять набор операций к списку параметров:
php function process($var1, $var2, $farr) < foreach ($farr as $f) < echo $f($var1, $var2) . "\n"; > > // create a bunch of math functions $farr = array( create_function('$x,$y', 'return "some trig: ".(sin($x) + $x*cos($y));'), create_function('$x,$y', 'return "a hypotenuse: ".sqrt($x*$x + $y*$y);'), create_function('$a,$b', 'if ($a >=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 "\nUsing the first array of dynamic functions\n"; echo "parameters: 2.3445, M_PI\n"; process(2.3445, M_PI, $farr); // now make a bunch of string processing functions $garr = array( create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '. 'and \"$b\"\n** Look the same to me! (looking at the first 3 chars)";'), 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 "\nUsing the second array of dynamic functions\n"; process("Twas brilling and the slithy toves", "Twas the night", $garr); ?>
Опять же, вот тот же код с использованием анонимных функций . Обратите внимание, что имена переменных в коде больше не нужно экранировать, поскольку они не заключены в строку.
function process($var1, $var2, $farr) < foreach ($farr as $f) < echo $f($var1, $var2) . "\n"; > > // create a bunch of math functions $farr = array( function($x,$y) < return "some trig: ".(sin($x) + $x*cos($y)); >, function($x,$y) < return "a hypotenuse: ".sqrt($x*$x + $y*$y); >, function($a,$b) < if ($a >=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 "\nUsing the first array of dynamic functions\n"; echo "parameters: 2.3445, M_PI\n"; process(2.3445, M_PI, $farr); // now make a bunch of string processing functions $garr = array( function($b,$a) < if (strncmp($a, $b, 3) == 0) return "** \"$a\" " . "and \"$b\"\n** Look the same to me! (looking at the first 3 chars)"; >, function($a,$b) < return "CRCs: " . crc32($a) . ", ".crc32($b); >, function($a,$b) < return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)"; > ); echo "\nUsing the second array of dynamic functions\n"; process("Twas brilling and the slithy toves", "Twas the night", $garr); ?>
Выводится приведенный выше пример:
Using the first array of dynamic functions parameters: 2.3445, M_PI some trig: -1.6291725057799 a hypotenuse: 3.9199852871011 b*a^2 = 4.8103313314525 min(b^2+a, a^2,b) = 8.6382729035898 ln(a)/b = 0.27122299212594 Using the second array of dynamic functions ** "Twas the night" and "Twas brilling and the slithy toves" ** Look the same to me! (looking at the first 3 chars) CRCs: 3569586014, 342550513 similar(a,b) = 11(45.833333333333%)
Пример #3 Использование динамических функций в качестве функций обратного вызова
Возможно, наиболее распространенным использованием динамических функций является передача их в качестве обратных вызовов, например, при использовании array_walk() или usort() .
$av = array("the ", "a ", "that ", "this "); array_walk($av, create_function('&$v,$k', '$v = $v . "mango";')); print_r($av); ?>
$av = array("the ", "a ", "that ", "this "); array_walk($av, function(&$v,$k) < $v = $v . "mango"; >); print_r($av); ?>
Выводится приведенный выше пример:
Array ( [0] => the mango [1] => a mango [2] => that mango [3] => this mango )
Сортировка строк от самой длинной к самой короткой с помощью create_function() :
$sv = array("small", "a big string", "larger", "it is a string thing"); echo "Original:\n"; print_r($sv); echo "Sorted:\n"; usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);')); print_r($sv); ?>
$sv = array("small", "a big string", "larger", "it is a string thing"); echo "Original:\n"; print_r($sv); echo "Sorted:\n"; usort($sv, function($a,$b) < return strlen($b) - strlen($a); >); print_r($sv); ?>
Выводится приведенный выше пример:
Original: Array ( [0] => small [1] => a big string [2] => larger [3] => it is a string thing ) Sorted: Array ( [0] => it is a string thing [1] => a big string [2] => larger [3] => small )
See Also
PHP 8.2
(PHP 4,5,7,8)count_chars Возвращает информацию об использованных символах string Подсчитывает количество вхождений каждого байта-значения (0..255)в строке и возвращает
(PHP 4 4.0.1,5,7,8)crc32 Вычисляет полином строки Генерирует полином контрольной суммы циклической избыточности строки 32-битной длины.
(PHP 4,5,7,8)crypt Одностороннее хэширование строк Эта функция не является (пока)бинарно безопасной! crypt()вернет хэшированную строку,используя стандартный DES,основанный на Unix.
(PHP 4 4.0.4,5,7,8)ctype_alnum Проверка наличия буквенно-цифрового символа(ов)Проверяет,все ли символы в предоставленной строке,тексте,являются буквенно-цифровыми.
Php динамические имена функций
Можно ли в PHP динамически изменять название функции?
Допустим есть функция function wp_widget($args)
Нужно сделать так чтобы название функции wp_widget
динамически изменялось. Т.е. изначально оно не известно, а в процессе работы кода подставлялось из переменной.
Например так: function $wp_widget ($args)
Можно ли это как-то претворить в жизнь?
function funct1 ()
<
echo «Мы внутри функции funct1( );
» ;
>
function funct2 ()
<
echo «Мы внутри функции funct2( );
» ;
>
$myfunct = «funct1» ;
$myfunct ();
$myfunct = «funct2» ;
$myfunct ();
?>
Для чего нужно: Пишу плагин для WordPress, точнее дорабатываю уже написанный (мною же). Работает прекрасно, если на каждый домен устанавливается отдельный движок. А при использовании перенаправлений (аллиасов) префикс генерируеся автоматически в файле wp_config.php. И чтобы в этом случае плагин работал, нужно его зарегистрировать под разными именами, которые автоматически генерируются в зависимости от префикса.
Немного другой вопрос: Можно ли в качестве имени функции использовать константу?
Например так:
define (» wp_widget «, ‘$wp_widget’);
function wp_widget ($args)
Динамическое имя функции в php
Я хотел бы упростить создание «Пользовательских типов записей» в WordPress, поскольку утомительно проходить один и тот же сценарий и снова и снова менять все экземпляры имен пользовательских типов записей вручную.
Это довольно просто сделать, создав переменную, содержащую имя CPT, и использовать ее везде, где это необходимо. Таким образом, все, что мне нужно сделать, это объявить переменную в начале скрипта, и это должно позаботиться обо всем остальном.
Единственная проблема заключается в том, что для того, чтобы это работало, мне также нужно добавить префикс имени CPT перед каждой функцией в скрипте, и кажется, что использование переменной в имени функции не легко или даже не рекомендуется в PHP.
Вот пример ниже, чтобы прояснить это:
$prefix = 'news'; function news_custom_type_init() < global $prefix; register_post_type($prefix, array( 'labels' =>array( 'name' => $prefix, 'singular_label' => $prefix, 'add_new' => 'Add', . )); register_taxonomy_for_object_type( 'category', $prefix ); > add_action('init', $prefix.'_custom_type_init');
Это почти нормально и может быть стандартизировано, если только я смогу динамически переименовать функцию, чтобы не писать слово «новости» перед ней, а вместо этого использовать префикс «$».
Это могло бы быть хорошо, но просто не работает:
$prefix = 'news'; $functionName= $prefix."_custom_type_init"; function $functionName() < global $prefix; register_post_type($prefix, array( 'labels' =>array( 'name' => $prefix, 'singular_label' => $prefix, 'add_new' => 'Add', . )); register_taxonomy_for_object_type( 'category', $prefix ); > add_action('init', $prefix.'_custom_type_init');
Необходимость именовать функцию как бы побеждает первоначальную цель моей попытки (особенно, когда скрипт включает в себя десятки подобных функций).
Каков был бы лучший способ сделать это?
PS: я много гуглил и «переполнялся стеком» по этому поводу, но не нашел ни одного рабочего решения, которое бы соответствовало моим потребностям и не генерировало сообщение об ошибке WordPress.