PHP 7.2不推荐使用函数create_function()

vwhgwdsa  于 2022-12-28  发布在  PHP
关注(0)|答案(6)|浏览(118)

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

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

但是对于PHP 7.2.0,create_function()已被弃用。
如何为PHP 7.2.0重写上面的代码?

lo8azlld

lo8azlld1#

我想贡献一个非常简单的情况下,我发现在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()来创建函数。

l5tcr1uw

l5tcr1uw2#

自动升级

如果有人需要将代码中的许多create_function()用例升级为匿名函数,我会使用一个名为Rector的工具。
它遍历代码并以匿名函数1:1替换create_function。它在30 various cases上进行了测试。

安装

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);
};

运行您的代码

# this is set run, it only report what it would change
vendor/bin/rector process --config rector.php --dry-run

# this actually changes the code
vendor/bin/rector process --config rector.php

# the "rector.php" config is loaded by default, so we can drop it
vendor/bin/rector process

**编辑:**更新于2020年10月31日,使用PHP Rector 0.8.x语法

vhipe2zx

vhipe2zx3#

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

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

Arrow函数比匿名函数要短,并且使用父作用域--所以你可以引用$delimiter而不需要传入它。

dfuffjeb

dfuffjeb4#

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

// 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语句的输出,然后只需将函数重新Map到您自己的意愿即可!
快乐编码=)

rqqzpn5f

rqqzpn5f5#

匿名函数解决方案可以工作,但是如果要返回的表达式是字符串形式的,我认为应该使用eval

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

ddhy6vgd6#

您应该能够使用Anonymous Function(aka Closure)调用父作用域的$delimiter变量,如下所示:

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

相关问题