如何使Symfony Project 1.4.20与PHP 5.5或5.6完全兼容(不推荐使用(preg_replace()警告))

本文概述

  • 是什么原因导致该问题?
  • 如何正确解决?
有时, 由于代码量大和更新成本高, 许多Web项目仍在旧PHP平台上运行(而不是旧版本5.3), 而旧框架为Symfony 1.x.就其本身而言, 代码没有什么错, 因为它可以很好地工作, 但是很难找到它的文档。除了时间, 人们还发现了框架上的安全漏洞, 并且可以加以利用, 这就是为什么总是建议继续使用较新版本的框架的原因。使用Symfony并不容易, 因为工作流程发生了显着变化, 这意味着所有源代码都需要更改。
如果你不愿意重写Symfony 1.4.20中制作的大型应用程序, 则仍可以在较新版本的PHP中运行它, 这样反过来, 它也比较旧版本更安全。唯一的问题是, 由于preg_replace使用不安全, 你将在项目上不断看到不推荐使用的警告。
是什么原因导致该问题?由于正则表达式的/ e修饰符, 因此在项目中触发了该问题。 preg_replace中的/ e修饰符已在PHP 5.5上弃用, 因为它可用于执行任意代码执行, 如POSIX模式修饰符文档中所述。因此, 问题在于, Symfony 1.4.20的许多源文件中都使用了这种模式, 以简单地” 驼峰” 一些字符串, 这就是为什么你在项目上以图形方式看到警告的原因。
除非你已在index.php中启用调试(仅出现在frontend_dev.php上), 否则警告不会在生产环境中显示, 因此从理论上讲, 提供一个简单的解决方案(快速解决方案)可以通过简单地忽略警告来消除那些警告的出现。 E_DEPRECATED标志。你可以在项目的settings.yml文件中实现此目的:
# YourProject/apps/YourApp/config/settings.ymldev:.settings:error_reporting:< ?php echo ((E_ALL | E_STRICT) ^ E_DEPRECATED)."\n" ?>

这将立即隐藏那些警告, 使其不会出现在开发环境中, 但是, 这并不是最正确的处理方式, 因为在将来, 这些功能可以删除, 并且你的应用程序将无法再使用。
如何正确解决?要遵循使代码至少持续几个版本使用的良好实践正确解决此问题, 是解决在需要的地方实现preg_replace_callback函数的错误。你将需要从Symfony 1.4.20的源代码中总共修改7个文件:
1. /symfony/lib/util/sfToolkit.class.php在此文件中, 你需要在类末尾添加以下方法:
public static function camelize($text){if (preg_match('#/(.?)#', $text, $matches)) {$text = str_replace($matches[0], '::'.strtoupper($matches[1]), $text); }if (preg_match('/(^|_|-)+(.)/', $text, $matches)) {$text = str_replace($matches[0], strtoupper($matches[2]), $text); }return $text; }

此方法稍后将用于其他文件。
2. /symfony/lib/util/sfInflector.class.php在第28行附近的该文件中, 将驼峰函数替换为以下代码:
public static function camelize($lower_case_and_underscored_word){$tmp = $lower_case_and_underscored_word; return sfToolkit::camelize($tmp); }

3. /symfony/lib/response/sfWebResponse.class.php在第407行附近的该文件中, 用以下代码替换normalizeHeaderName:
protected function normalizeHeaderName($name){return preg_replace_callback('/\-(.)/', function ($matches) { return '-'.strtoupper($matches[1]); }, strtr(ucfirst(strtolower($name)), '_', '-')); }

4. /symfony/lib/plugins/sfPropelPlugin/lib/form/sfFormFilterPropel.class.php在第264行附近的该文件中, 将驼峰函数替换为以下代码:
protected function camelize($text){return sfToolkit::camelize($text); }

5. /symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormFilterDoctrine.class.php在第324行附近的该文件中, 将驼峰函数替换为以下代码:
protected function camelize($text){return sfToolkit::camelize($text); }

6. /symfony/lib/form/addon/sfFormObject.class.php在此文件中靠近279行的位置, 将驼峰函数替换为以下代码:
protected function camelize($text){return sfToolkit::camelize($text); }

7. /symfony/lib/command/sfCommandManager.class.php在第109行附近的该文件中, 更改在else if语句中执行的以下代码:
// hack to split arguments with spaces : --test="with some spaces"$arguments = preg_replace('/(\'|")(.+?)\\1/e', "str_replace(' ', '=PLACEHOLDER=', '\\2')", $arguments); $arguments = preg_split('/\s+/', $arguments); $arguments = str_replace('=PLACEHOLDER=', ' ', $arguments);

有了这个新代码:
// hack to split arguments with spaces : --test="with some spaces"$arguments = preg_replace_callback('/(\'|")(.+?)\\1/', function($matches) {return str_replace(' ', '=PLACEHOLDER=', $matches[2]); }, $arguments); $arguments = preg_split('/\s+/', $arguments); $arguments = str_replace('=PLACEHOLDER=', ' ', $arguments);

更改所有文件后, 清除项目的缓存, 然后在浏览器中再次访问它。现在, 警告不应再出现。
【如何使Symfony Project 1.4.20与PHP 5.5或5.6完全兼容(不推荐使用(preg_replace()警告))】“ 快乐” 的传统编码!

    推荐阅读