PHP 7.2函数create_function()已弃用

时间:2018-01-09 04:39:25

标签: php

我在下面的应用程序中使用了create_function。

$callbacks[$delimiter] = create_function('$matches', "return '$delimiter' . strtolower(\$matches[1]);");

但是对于PHP 7.2.0,不推荐使用create_function()。

任何想法,如何在PHP 7.2.0上修复我的代码。

感谢您的帮助,

6 个答案:

答案 0 :(得分:52)

您应该能够使用Anonymous Function(又名Closure)来调用父范围的$delimiter变量,如下所示:

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

答案 1 :(得分:29)

我想为我在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);

我们可以看到function()的用法,这是非常典型的函数创建,而不是不建议使用的create_function()创建函数。希望对您有所帮助。

答案 2 :(得分:1)

如果有人需要将其代码中的数十个create_function()案例升级为匿名函数,那么我将开发一个名为Rector的工具。

它遍历代码,并用匿名函数1:1代替create_function。已在30 various cases上进行了测试。

安装

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

答案 3 :(得分:0)

这个匿名函数数组对我有用,请参见下面的代码:

// 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语句的输出,然后只需将函数重新映射为您自己的意愿即可!

快乐编码=)

答案 4 :(得分:0)

从 PHP 7.4 开始,您可以使用 Arrow function:

$callbacks[$delimiter] = fn($matches) => $delimiter . strtolower($matches[1]);

箭头函数比匿名函数更短,并且使用父作用域 - 因此您可以在不传入 $delimiter 的情况下引用它。

答案 5 :(得分:-1)

接受的答案是正确的方法。 但是,在某些情况下,您无法更改代码(遗留代码、复杂环境)。对于那种情况,我写了一个包:

https://github.com/lombax85/create_function

使用 composer require lombax85/create_function

安装