PHP 7.2函数create_function()已弃用

Sal*_*aly 39 php

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

$callbacks[$delimiter] = create_function('$matches', "return '$delimiter' . strtolower(\$matches[1]);");
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的帮助,

e_i*_*_pi 58

您应该能够使用匿名函数(也称为Closure)来调用父作用域$delimiter变量,如下所示:

$callbacks[$delimiter] = function($matches) use ($delimiter) {
    return $delimiter . strtolower($matches[1]);
};
Run Code Online (Sandbox Code Playgroud)


Joa*_*cat 35

我想用一个我在Wordpress主题中找到的一个非常简单的案例做出贡献并且似乎正常工作:

拥有以下add_filter语句:

add_filter( 'option_page_capability_' . ot_options_id(), create_function( '$caps', "return '$caps';" ), 999 );
Run Code Online (Sandbox Code Playgroud)

替换为:

add_filter( 'option_page_capability_' . ot_options_id(), function($caps) {return $caps;},999);
Run Code Online (Sandbox Code Playgroud)

我们可以看到function()的用法,非常典型的函数创建,而不是弃用的create_function()来创建函数.希望能帮助到你.

  • @Dwza 是的,只有我要扩展这个话题。而已。 (6认同)
  • 因为我正在寻找特定于 WordPress 的修复程序,所以我喜欢你的示例。即使已经有了批准的答案,拥有_额外_用例总是好的...... (3认同)
  • 我看到一个例子非常有帮助。谢谢@Joanmacat! (2认同)

Tom*_*uba 6

自动升级

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

它遍历代码并create_function用匿名函数 1:1替换。它在30 种不同的情况下进行了测试。

安装

composer require rector/rector --dev
Run Code Online (Sandbox Code Playgroud)

设置

假设您要升级/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);
};
Run Code Online (Sandbox Code Playgroud)

运行你的代码

# 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
Run Code Online (Sandbox Code Playgroud)

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

  • 哦,yml 文件已弃用几个月了。我会更新这篇文章,谢谢你让我知道! (3认同)