【问题标题】:Fatal error: Cannot redeclare (PHP/Apache Setup)致命错误:无法重新声明(PHP/Apache 设置)
【发布时间】:2012-07-28 02:19:33
【问题描述】:

我在我的 Mac (Mountain Lion) 上运行 Apache2/PHP5 网络服务器。当我从 Lion 升级到 Mountain Lion 时,我丢失了开发环境/配置。在尝试设置所有内容时,我不知何故破坏了我的 httpd 或 php.ini 配置(我认为,无论如何)......当我将浏览器指向我的本地主机时,我得到了臭名昭著的 PHP 错误:

致命错误:无法重新声明(某些随机函数)。

不管我指向哪个页面,我都明白了。在我的网络服务器设置丢失之前,这并没有发生,所以我确信文件没问题并且所有语法都很好(整个站点也一直使用 include_once 和 require_once)。

我认为这与我的虚拟主机设置或工作目录设置有关...我尝试了很多东西,但到目前为止没有任何乐趣。

我很乐意提供任何/所有有用的信息...我对此束手无策。任何帮助或建议将不胜感激。

【问题讨论】:

  • 试试<?php phpinfo(); ?> 文件。这行得通吗?

标签: apache2 php


【解决方案1】:

您很可能更改了include_path,因此您正在使用不同的路径加载相同的php 文件。当您这样做时,php 无法判断它是同一个文件,因此它会再次加载该文件,从而导致 Cannot redeclare 错误。

追踪问题的一种方法是在违规行之前添加以下内容:

echo "<pre>";
print_r(explode(PATH_SEPARATOR, get_include_path()));
print_r(get_included_files());

【讨论】:

    【解决方案2】:

    致命错误:无法重新声明(某些随机函数)/类

    Always 表示之前已经定义了同名的函数或类, 看看这个例子:

    <?php
    
    
    function test(){
     return 1;
    }
    
    function test(){
     return 2;
    }
    //will produce fatal error like yours
    
    
    class A {}
    class A {}
    //Will say that it can't redeclare class A
    

    这是您应该从这里开始的线索 确保:,您的包含路径已相应设置

    要获得一些线索,请尝试:

    <?php
    
    print_r ( get_included_files() );
    
    ?>
    

    【讨论】:

    • 是的,是这样,但问题不在于它的项目,而在于 apache。你只是给出了错误的线索,你没有提供解决它的答案。
    • 但是 - 它说PHP : Fatal error cannot redeclare ... 那么我们有什么? 1) 此文件(包含的函数/类)之前已包含,用户再次包含此文件,通过 include() 而不是 include_once() 2) get_included_files() 将有助于确定该文件是否需要包含
    • 作者应该提供更多信息,我同意你的观点。但是这个错误不是作者的错。它可能是包含 2 次并运行两次的 Apache 类。因此,您可以给出的最佳建议是对服务器进行全新的全新安装并清理 apache 文件夹。运行 get_included_files() 会给他他包含的文件,而不是 Apache。
    • 全新且干净的安装可能是一项肮脏的工作——这是非常普遍的建议。一切都取决于技能/服务器等。我知道问题出在include_path-我在回答中也提到过
    【解决方案3】:

    在我的特殊情况下,它碰巧是一个糟糕的虚拟主机设置。一旦我在那里解决了一种重定向问题,它就解决了问题。

    这里提供的其他两个答案(和 cmets)都非常好,应该可以帮助将来有类似问题的任何人调试他们的代码。您很少会像我对虚拟主机所做的那样搞砸并遇到这个问题(但不是很多其他问题)。非常感谢 Ross Smith II、metal_fan 和 Jeffrey 在这方面的帮助!

    【讨论】:

      【解决方案4】:

      我刚刚在另一个论坛中解决了这个问题。 就我而言,问题是: <?php include "file.inc"; $user = new user() .... ?> <?php include "file.inc" .... ?> 我包含了两次“file.inc”,这就是问题所在。只需将包含保留在“主”文件中即可!

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 2014-11-07
        • 1970-01-01
        • 2017-05-22
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多