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

PHP7.2及以上版本create_function()迁移:如何将含create_function()的编码函数改写为匿名函数

没问题,我来帮你把这段代码里的create_function()替换成PHP推荐的匿名函数(闭包),其实转换逻辑非常直接,咱们一步一步来:

首先得明确,create_function()在PHP7.2起就被弃用,PHP8.0更是直接移除了这个函数,换成匿名函数不仅能解决兼容性问题,还更安全、可读性更强,也避免了原写法里字符串拼接函数体的潜在风险。

改写后的完整代码

function encode_code_in_comment( $source ) {
    $encoded = preg_replace_callback( '/\[(php|html|javascript|css|nginx|apache|terminal)\](.*?)\[\/\1\]/ims',
        function( $matches ) {
            // 移除代码块内容首尾的换行符
            $matches[2] = preg_replace( array("/^[\r|\n]+/i", "/[\r|\n]+$/i"), "", $matches[2]);
            // 返回格式化后的带语法高亮的代码块
            return "<pre class=\"language-" . $matches[1] . "\"><code>" . esc_html( $matches[2] ) . "</code></pre>";
        },
        $source
    );
    // 简化原有的判断逻辑,效果完全一致
    return $encoded ?: $source;
}

关键转换点说明

  1. 替换create_function为匿名函数:
    原代码里create_function('$matches', '函数体字符串')的结构,直接换成function($matches) { 函数体代码 }就行——不需要再用字符串包裹函数逻辑,避免了字符串转义的麻烦,也更方便后续维护。
  2. 逻辑完全复用:
    匿名函数的参数$matches和原create_function()里的参数完全对应,所以内部的正则替换、HTML拼接逻辑不需要做任何修改,直接迁移过来即可。
  3. 简化返回判断:
    原代码里的if ($encoded) { return $encoded; } else { return $source; }可以用PHP的三元运算符简写return $encoded ?: $source;,逻辑完全一致,代码更简洁。

这样改写后,代码就能完美兼容PHP7.2及以上的所有版本,运行逻辑和原代码完全相同。

内容的提问来源于stack exchange,提问作者Roee Yossef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:07:39