PHP 7.2 Функция create_function() устарела
Я использовал create_function в моем приложении ниже.
$callbacks[$delimiter] = create_function('$matches', "return '$delimiter' . strtolower(\$matches[1]);");
Но для PHP 7.2.0, create_function() устарела.
Любая идея, как исправить мои коды выше на PHP 7.2.0.
Спасибо за вашу помощь,
8 ответов
Вы должны быть в состоянии использовать анонимную функцию (она же Closure) с вызовом родительской области $delimiter
переменная, вот так:
$callbacks[$delimiter] = function($matches) use ($delimiter) {
return $delimiter . strtolower($matches[1]);
};
Я хотел бы внести свой вклад в очень простой случай, который я нашел в теме Wordpress и, кажется, работает правильно:
Имея следующий оператор add_filter:
add_filter( 'option_page_capability_' . ot_options_id(), create_function( '$caps', "return '$caps';" ), 999 );
Заменить его на:
add_filter( 'option_page_capability_' . ot_options_id(), function($caps) {return $caps;},999);
Мы можем увидеть использование функции (), очень типичного создания функции вместо устаревшей create_function() для создания функций. Надеюсь, поможет.
Если кому-то нужно обновить десятки create_function()
в своем коде анонимных функций я работаю над инструментом под названием Rector.
Он проходит через код и заменяет create_function
с анонимными функциями 1:1. Это проверено на 30 различных случаях.
устанавливать
composer require rector/rector --dev
Настроить
# rector.yml
services:
Rector\Php\Rector\FuncCall\CreateFunctionToAnonymousFunctionRector: ~
Запустите свой код
vendor/bin/rector process src --config rector.yml --dry-run
vendor/bin/rector process src --config rector.yml
Попробуйте это вместо этого:
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
Начиная с PHP 7.4 вы можете использовать функцию стрелки :
$callbacks[$delimiter] = fn($matches) => $delimiter . strtolower($matches[1]);
Стрелочные функции короче анонимных и используют родительскую область видимости, поэтому вы можете ссылаться на разделитель $, не передавая его.
Этот массив анонимных функций работал для меня, см. Код ниже:
// This will be a dynamic name that could
// be used as a function like "namespace".
$dynamic_name = 'my_dynamic_name';
// Here's some variables that you could use in the scope of
// your dynamic anonymous functions.
$outerVariable = 'If I need this varible, I can use it';
$outerVariableTwo = 'If I need this varible, I can use it too!';
// Create an array that we can later use and turn into
// and associative array with our new dynamic anonymous functions.
$dynamicAnonFunctions = [];
// Create the first dynamic function.
$dynamicAnonFunctions[($dynamic_name."_func_one")] = function () use ($outerVariable, $dynamic_name) {
echo 'Running: function <b>'.$dynamic_name .'_func_one()</b>';
echo '<br><br>';
echo $outerVariable;
echo '<br><br>';
echo 'This works :)';
echo '<br><br>';
};
// Create the second dynamic function
$dynamicAnonFunctions[($dynamic_name."_func_two")] = function () use ($outerVariableTwo, $dynamic_name) {
echo '- - - - - - - - - - - - - - - - - - - ';
echo '<br><br>';
echo 'Running: function <b>'.$dynamic_name .'_func_two()</b>';
echo '<br><br>';
echo $outerVariableTwo;
echo '<br><br>';
echo 'This also works :)!';
echo '<br><br>';
};
// Call the functions.
$dynamicAnonFunctions[($dynamic_name."_func_one")]();
$dynamicAnonFunctions[($dynamic_name."_func_two")]();
// Halt execution.
exit();
Просто скопируйте это в свой файл скрипта, и вы увидите вывод echo
заявления, а затем просто переназначить функцию по собственному желанию!
Удачного кодирования =)
Решение анонимной функции работает, но если возвращаемое выражение находится в строке, я думаю
eval
должен быть использован.
$callbacks[$delimiter] = eval('return function($matches){return '.$delimiter.' . strtolower($matches[1]);};');
Принятый ответ - правильный путь. Однако бывают случаи, когда вы НЕ МОЖЕТЕ изменить код (устаревший код, сложная среда). Для этого случая я написал пакет:
https://github.com/lombax85/create_function
установить его с
composer require lombax85/create_function