You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.2中create_function()已废弃,现有代码需如何调整?

解决PHP 7.2+中create_function()废弃的问题

首先明确:create_function()在PHP 7.2.0被废弃,PHP 8.0.0直接被移除,所以不管是从兼容性还是代码安全性考虑,优先自行修改代码,等开发者更新可能会让你的应用在高版本PHP环境下报错,影响正常运行。

原代码问题分析

你贴的这段代码用create_function()创建了一个无参的匿名函数,核心逻辑是读取cherry-core.php的版本号,对比已加载的版本,更新全局的$chery_core_version变量。但create_function()本质是通过eval实现的,存在安全风险,这也是它被废弃的主要原因之一。

替代方案:使用PHP闭包(匿名函数)

PHP 5.3及以上版本就支持闭包(匿名函数),这是官方推荐的create_function()替代方案,不仅更安全,性能也更优。

修改后的代码如下:

return function() {
    global $chery_core_version;
    $path = trailingslashit( dirname( __FILE__ ) ) . 'cherry-core.php';
    $data = get_file_data( $path, array( 'version' => 'Version' ) );
    $version = $data['version'] ?? null;
    
    if ( null !== $chery_core_version ) {
        $old_versions = array_keys( $chery_core_version );
    } else {
        $old_versions = null;
    }
    
    if ( is_array( $old_versions ) && isset( $old_versions[0] ) ) {
        $compare = version_compare( $old_versions[0], $version, '<' );
        if ( $compare ) {
            $chery_core_version = array( $version => $path );
        }
    } else {
        $chery_core_version = array( $version => $path );
    }
};

关键修改点说明

  1. 把create_function('', "...")直接替换成function() { ... }闭包形式,无需再用字符串拼接代码,避免了eval的安全隐患。
  2. 优化了$version的赋值逻辑,用?? null简化了原来的isset判断,代码更简洁(这一步可选,保留原逻辑也完全可行)。
  3. 最后赋值$chery_core_version时,直接用array( $version => $path )代替分步赋值,逻辑一致但更紧凑。

关于自行修改还是等开发者更新的建议

  • 如果这段代码是你自己开发维护的:直接修改成闭包版本,一步到位解决兼容性问题,同时提升代码安全性。
  • 如果是第三方主题/插件的代码:可以先自行临时修改(注意备份原代码,避免后续插件更新覆盖),同时给开发者提交反馈或issue,催促他们更新适配高版本PHP。毕竟现在主流服务器环境都已经升级到PHP 8.x了,继续使用废弃函数会导致警告甚至致命错误。

内容的提问来源于stack exchange,提问作者Алексей Гужавин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:12:40