Symfony 1.4 使用 php 5.5 中已弃用的函数

我最近将PHP从版本5.3.27升级到5.5.0。在我的Symfony 2.3.2项目中一切正常,我可以享受最新的PHP功能。

现在,当我回到我的另一个Symfony 1.4.16项目时,我得到一个关于preg_replace被/e修饰符弃用的PHP错误。

我在论坛中找不到有关此错误的参考:以前有人遇到过此问题吗?有没有我可以开箱即用的补丁?升级到Symfony 1.4.20可以解决此问题吗?

错误消息如下所示:

已弃用: preg_replace(): /e 修饰符已弃用,请在 /myproject/lib/vendor/symfony/lib/response/sfWebResponse.class.php 第 409 行中使用preg_replace_callback

一种方法是按照消息和手册中的建议修改代码。如何将preg_replace表达式更改为preg_replace_callback调用?

任何帮助/提示将非常受欢迎。

编辑:

到目前为止,还没有针对此的补丁(Symfony 1.4.20没有解决这个问题)。解决方案是将对preg_replace的失败调用替换为对sourche中preg_replace_callback的相应调用,这在sfWebResponse类中很容易完成(感谢提示Jon)。不幸的是,现在下一个失败事件稍微复杂一些...另一方面,我们可能不得不在 /e 选项中寻找preg_replace用途,以便找出 Symfony 可能在哪里中断。这给出了相当多的结果:o

所以。。。我的结论是,Symfony 1.4用户最好不要将PHP升级到5.5版本,直到一些严肃的补丁出现。你觉得怎么样?还有其他选择吗?


答案 1

除非您在 index.php 中启用了 debug,否则这些错误不会显示在 prod 中。也可以通过在 settings.yml 中取消设置E_DEPRECATED标志,在开发中删除它们:

dev:
  .settings:
    error_reporting:  <?php echo ((E_ALL | E_STRICT) ^ E_DEPRECATED)."\n" ?>

答案 2

基本上,您要做的是从调用中获取替换参数并将其分解为适当的PHP表达式,然后将该表达式作为将用作等效调用的回调的函数体。preg_replacepreg_replace_callback

在您的情况下,相关代码

return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", /* input */)

所以你会这样做

$callback = function($matches) {
    return '-'.strtoupper($matches[1]);
};

return preg_replace_callback('/\-(.)/', $callback, /* input */)

如您所见,回调代码与原始替换表达式相同,唯一的区别是诸如 之类的引用被数组访问替换。\\1$matches[1]


推荐