在sfException中只能通过引用传递变量

时间:2011-10-20 14:50:56

标签: php symfony1

我有一个奇怪的问题,我找不到为什么会这样。一些背景优先。我在大约10台生产服务器上安装了symfony 1.4应用程序。它们都运行PHP 5.3.0,但我不确定是否所有都以相同的方式配置(它取决于管理员,我只熟悉php.ini文件的部分)。所以...几天前在其中一台服务器上报告了一个奇怪的错误。在动作类中每次调用forward方法之后(对于symfony非常熟悉的人来说唯一重要的事情就是它会执行并抛出一个继承sfException类的sfStopException)“致命错误:只有变量可以通过引用“生成错误。我在网上搜索了原因,这是我发现的 - the-stickman.com/web-development/php/php-505-fatal-error-only-variables-can-be-passed-by-参考/。我认为这篇文章完美地描述了问题和解决方案。到目前为止一切都很好 - 没什么奇怪的......直到我看到错误产生的地方 - 第293行的/ lib / vendor / symfony / lib / exception / sfException.class.php代表了这个方法:

/**
 * Returns an excerpt of a code file around the given line number.
 *
 * @param string $file  A file path
 * @param int    $line  The selected line number
 *
 * @return string An HTML string
 */
static protected function fileExcerpt($file, $line)
{
    if (is_readable($file))
    {
        // THIS LINE GENERATES THE ERROR
        $content = preg_split('#<br />#', highlight_file($file, true)); 

        $lines = array();
        for ($i = max($line - 3, 1), $max = min($line + 3, count($content)); $i <= $max; $i++)
        {
            $lines[] = '<li'.($i == $line ? ' class="selected"' : '').'>'.$content[$i - 1].'</li>';
        }

        return '<ol start="'.max($line - 3, 1).'">'.implode("\n", $lines).'</ol>';
    }
}

所以......考虑到解释为什么会产生这种类型的错误,我明白问题是什么,但我想不出一个好的解决方案。这部分代码对我的应用程序实际上并不重要 - 它只是在symfony堆栈跟踪中呈现php文件的代码(在一个生产服务器上我不能看到它并不是很大的痛苦,因为它不应该甚至不在那里可用。但我发现的唯一解决方案(快速解决方案)只是评论一些代码。现在用户可以使用我的应用程序,但这并没有让我高兴,因为我没有找到一个干净的解决方案(我不喜欢黑客攻击我自己的应用程序)。所以...我希望我已经很好地描述了这个问题,有人可以给我至少一些想法......谢谢:)。

编辑:这是php.ini的两部分:
- 第1部分 - http://pastie.org/2733955
- 第2部分 - http://pastie.org/2733961
我可以粘贴更多的php配置信息,但我需要知道会有什么兴趣 - php.ini是我熟悉的唯一的php配置...干杯:)。

1 个答案:

答案 0 :(得分:0)

更改 $content = preg_split('#<br />#', highlight_file($file, true));
$content = preg_split('#<br />#', ($hf = highlight_file($file, true)) );
那应该是诀窍。 (如果没有,那么我们将更接近答案。)

虽然说实话,我不确定为什么它会变得合适。根据文档,preg_split的第二个参数按值传递。哎呀,该片段中的所有功能都不需要通过引用传递。但话说回来,你确实说过这只发生在一个的服务器上,所以可能是配置错误。