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.

Спасибо за вашу помощь,

Ответ 1

Вы должны иметь возможность использовать Анонимную функцию (aka Closure) с вызовом переменной- $delimiter родителями, например:

$callbacks[$delimiter] = function($matches) use ($delimiter) {
    return $delimiter . strtolower($matches[1]);
};

Ответ 2

Я хотел бы внести свой вклад в очень простой случай, который я нашел в Wordpress Theme, и, похоже, работает правильно:

Имея следующую инструкцию 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() для создания функций. Надеюсь, поможет.

Ответ 3

Попробуйте это вместо этого:

$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

$greet('World');
$greet('PHP');

Ответ 4

Если кому-то нужно обновить десятки случаев 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

Ответ 5

Этот массив анонимных функций работал для меня, см. Код ниже:

// This will be a dynamic name that could 
// be used as a function like "namespace".
$dynamic_name = 'my_dynamic_name';

// Here 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, а затем просто переназначите функцию по собственному желанию!

Удачного кодирования =)