Переменные функции

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.

Источник

Читайте также:  Navigation graph android java
Оцените статью