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

Другие вопросы по тегам