PHP 7.2函数create_Function()已弃用

PHP 7.2函数create_Function()已弃用,php,Php,我在下面的应用程序中使用了create_函数 $callbacks[$delimiter] = create_function('$matches', "return '$delimiter' . strtolower(\$matches[1]);"); 但对于PHP7.2.0,create_函数()已被弃用 你知道如何在PHP7.2.0上修复上面的代码吗 感谢您的帮助,您应该能够在调用父作用域$delimiter变量时使用(aka闭包),如下所示: $callbacks[$delimiter

我在下面的应用程序中使用了create_函数

$callbacks[$delimiter] = create_function('$matches', "return '$delimiter' . strtolower(\$matches[1]);");
但对于PHP7.2.0,create_函数()已被弃用

你知道如何在PHP7.2.0上修复上面的代码吗


感谢您的帮助,

您应该能够在调用父作用域
$delimiter
变量时使用(aka闭包),如下所示:

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

我想用我在Wordpress主题中发现的一个非常简单的案例来做一点贡献,它似乎工作正常:

具有以下添加过滤器语句:

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()来创建函数。希望有帮助。

自动升级 如果有人需要将其代码中的几十个
create_function()
案例升级为匿名函数,我将使用一个名为

它遍历代码并将
create_函数
替换为匿名函数1:1。这是经过测试的

安装

composer require rector/rector --dev
设置

假设您要升级
/src
目录中的代码

# rector.php
<?php

use Rector\Core\Configuration\Option;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Rector\Php72\Rector\FuncCall\CreateFunctionToAnonymousFunctionRector;

return static function (ContainerConfigurator $containerConfigurator) {
    $parameters = $containerConfigurator->parameters();
    $parameters->set(Option::PATHS, [
        __DIR__ . '/src',
    ]);

    $services = $containerConfigurator->services();
    $services->set(CreateFunctionToAnonymousFunctionRector::class);
};


编辑:使用PHP Rector 0.8.x语法更新了2020-10-31

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

// 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();
//这将是一个动态名称,可以
//可以用作类似“名称空间”的函数。
$dynamic_name='my_dynamic_name';
//以下是一些变量,您可以在
//您的动态匿名函数。
$outerVariable='如果我需要这个变量,我可以使用它';
$outerVariableTwo='如果我需要这个变量,我也可以使用它!';
//创建一个数组,我们以后可以使用它并将其转换为
//并使用新的动态匿名函数关联数组。
$dynamiconfunctions=[];
//创建第一个动态函数。
$dynamicanFunctions[($dynamic_name.\u func_one”)]=函数()使用($outerVariable,$dynamic_name){
echo“Running:function.$dynamic_name.\u func_one()”;
回音“

”; echo$outervable; 回音“

”; 呼应“这个作品:)”; 回音“

”; }; //创建第二个动态函数 $dynamicanFunctions[($dynamic_name.“_func_two”)]=函数()使用($outerVariableTwo,$dynamic_name){ 回声'-----''; 回音“

”; echo“Running:function.$dynamic_name.\u func_two()”; 回音“

”; echo$outerVariableTwo; 回音“

”; echo“这也有效:)!”; 回音“

”; }; //调用函数。 $dynamiconfunctions[($dynamic_name.\u func_one”)](); $dynamiconfunctions[($dynamic_name.\u func_two”)](); //停止执行。 退出();
只需将其复制到脚本文件中,您就会看到
echo
语句的输出,然后只需根据自己的意愿重新映射函数即可


Happy coding=)

由于PHP 7.4,您可以使用:


箭头函数比匿名函数短,并且使用父作用域-因此您可以引用$delimiter而无需传入它。

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


使用
composer require lombax85/create_function安装它

如果这解决了问题,你可以创建一个匿名函数。我们可以看到你更大的
preg_
代码块吗?什么是匿名函数(闭包)并且@e_i_pi:)@Dwza已经发布过了。是的,只是我要扩展一下这个主题。没别的了。我很乐意看到一个例子。谢谢@Joannacat!因为我在寻找WordPress特定的修复程序,所以我喜欢你的例子。有额外的用例总是好的,即使已经有了一个被认可的答案…不知道为什么这不起作用。它可能需要更多的信息,或者已经发生了变化。我创建了yml文件,但它总是说无法加载资源。当我使用php文件时,一切正常。哦,yml文件已经有好几个月不推荐使用了。我会更新这篇文章,谢谢你让我知道!最好澄清命令行上的“src”和文件中的“/src”需要更改以匹配用户的路径。这也是文档中缺少的东西。它只是假设人们知道如何处理它,或者它首先会被改变。这一点很好。我会在这里更新答案。你能帮我把PR发送到GitHub上的文档自述文件吗?顺便说一句,我在MachForm使用的Braintree库中看到了这行代码,在一个片段中,IMO无论如何都不应该使用create_函数(出于垃圾收集的原因)。巧合
// 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();
$callbacks[$delimiter] = fn($matches) => $delimiter . strtolower($matches[1]);