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 ); } };
关键修改点说明
- 把
create_function('', "...")直接替换成function() { ... }闭包形式,无需再用字符串拼接代码,避免了eval的安全隐患。 - 优化了
$version的赋值逻辑,用?? null简化了原来的isset判断,代码更简洁(这一步可选,保留原逻辑也完全可行)。 - 最后赋值
$chery_core_version时,直接用array( $version => $path )代替分步赋值,逻辑一致但更紧凑。
关于自行修改还是等开发者更新的建议
- 如果这段代码是你自己开发维护的:直接修改成闭包版本,一步到位解决兼容性问题,同时提升代码安全性。
- 如果是第三方主题/插件的代码:可以先自行临时修改(注意备份原代码,避免后续插件更新覆盖),同时给开发者提交反馈或issue,催促他们更新适配高版本PHP。毕竟现在主流服务器环境都已经升级到PHP 8.x了,继续使用废弃函数会导致警告甚至致命错误。
内容的提问来源于stack exchange,提问作者Алексей Гужавин
相关产品推荐
相关产品推荐

