微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我尝试使用 rect 代码迁移时,不能使用自动全局变量作为词法变量

如何解决当我尝试使用 rect 代码迁移时,不能使用自动全局变量作为词法变量

我有代码需要迁移到较新的 PHP 版本。 此代码对现已弃用的 create_function 有很多用途。 为了避免手动更新所有内容,我尝试使用 rector

我已使用此 rector 配置文件更新所有 create_function 用途。

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

结果校长已将部分替换为

function register_skin_deactivation_hook_function($code,$function) {
    $GLOBALS[ 'register_skin_deactivation_hook_function' . $code] = $function;
    $fn=create_function('$skin',' call_user_func($GLOBALS["register_skin_deactivation_hook_function' . $code . '"]); delete_option("skin_is_activated_' . $code. '");');
    add_action( 'switch_s',$fn );
}

function register_skin_deactivation_hook_function($code,$function) {
    $GLOBALS[ 'register_skin_deactivation_hook_function' . $code] = $function;
    $fn=function ($skin) use ($GLOBALS,$code) {
            call_user_func($GLOBALS["register_skin_deactivation_hook_function{$code}"]);
            delete_option("skin_is_activated_{$code}");
    };
    add_action( 'switch_s',$fn );
}

但不幸的是这会导致错误

致命错误:不能使用自动全局变量作为词法变量

$fn=function ($skin) use ($GLOBALS,$code) {

我该如何解决这个问题?

解决方法

这是(或was)Rector 转换中的一个错误:它分析了您的create_function 语句中使用的变量,并构建了列出所有这些变量的use 子句。

然而,由于 $GLOBALS 是一个“超级全局”,它在所有范围内都可用,因此不需要(实际上不能)用 use 子句捕获。

正确的定义很简单:

function register_skin_deactivation_hook_function($code,$function) {
    $GLOBALS[ 'register_skin_deactivation_hook_function' . $code] = $function;
    $fn=function ($skin) use ($code) {
            call_user_func($GLOBALS["register_skin_deactivation_hook_function{$code}"]);
            delete_option("skin_is_activated_{$code}");
    };
    add_action( 'switch_s',$fn );
}

(注意:这是基于评论的社区 Wiki 答案,以避免问题显示为“未答复”。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。