【问题标题】:PHP Fatal error: Cannot redeclare classPHP致命错误:无法重新声明类
【发布时间】:2010-10-17 00:38:42
【问题描述】:

有谁知道什么会导致这个问题?

PHP 致命错误:无法重新声明类

【问题讨论】:

标签: php class fatal-error


【解决方案1】:

你必须使用 require_once() 函数。

【讨论】:

  • 我查看了此线程中的其他答案,似乎this、this 和this 也提到了require_once()。你能解释一下你的答案有什么不同吗?
【解决方案2】:

这实际上意味着该类已经在页面中声明并且您正在尝试重新创建它。

一个简单的技术如下。

我解决了以下问题。希望对您有所帮助。

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}

【讨论】:

    【解决方案3】:

    只要你包含或需要文件名,即class.login.php,只需做一件事。你可以这样包含它:

    include_once class.login.php or 
    require_once class.login.php
    

    这样它永远不会抛出错误。

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题“PHP 致命错误:无法重新声明类 XYZ.php”。

      我有两个目录,如controller 和model,我在两个目录中错误地上传了 XYZ.php。(所以同名文件会导致问题)。

      第一个解决方案:

      在您的整个项目中查找并确保您只有一个类 XYZ.php。

      第二种解决方案:

      在你的类中添加一个命名空间,这样你就可以使用相同的类名。

      【讨论】:

        【解决方案5】:

        当您在一个页面中多次声明一个类时会发生这种情况。 您可以通过使用 if 语句(如下所示)包装该类来修复它,或者您可以将其放入单独的文件中并使用 require_once(),而不是 include()。

        if (!class_exists('TestClass')) {
           // Put class TestClass here
        }
        

        【讨论】:

        • 这是 class_exists('TestClass') === false 或 !class_exist('TestClass')
        • 在@Jens-AndréKoch 评论中,第二个示例中缺少“s” --> 它是class_exists('TestClass') === false 或!class_exists('TestClass')
        • 是的。感谢您指出了这一点。不再可编辑.. 超时。
        • 感谢这个逻辑。
        【解决方案6】:

        我也遇到过同样的问题: 较新的 php 版本不能处理同一文件的多个包含(作为库),所以现在我必须通过一些 include_once 更改我的所有包含。

        如果你的库中没有太多类的话,这些技巧会有所帮助......

        if( class_exists('TestClass') != true )
        {
           //your definition of TestClass
        }
        

        【讨论】:

          【解决方案7】:

          我在使用autoload 时遇到了同样的问题,如下所示:

          <?php
          
          function __autoload($class_name)
          {
              include $class_name . '.php';
          }
          
          
          __autoload("MyClass1");
          
          $obj = new MyClass1();
          
          ?>
          

          在其他班级有:

          namespace testClassNamespace;
          
          
          class MyClass1
          {
          
              function  __construct()
              {
                  echo "MyClass1 constructor";
              }
          }
          

          解决方案是保持命名空间的兼容性,在我的示例中,namespace testClassNamespace; 在两个文件中都有。

          【讨论】:

            【解决方案8】:

            此函数将打印一个堆栈,告诉您它是从哪里调用的:

            function PrintTrace() {
                $trace = debug_backtrace();
                echo '<pre>';
                $sb = array();
                foreach($trace as $item) {
                    if(isset($item['file'])) {
                        $sb[] = htmlspecialchars("$item[file]:$item[line]");
                    } else {
                        $sb[] = htmlspecialchars("$item[class]:$item[function]");
                    }
                }
                echo implode("\n",$sb);
                echo '</pre>';
            }
            

            在包含您的类的文件顶部调用此函数。

            有时它只会打印一次,即使您的课程被包含两次或更多次。这是因为 PHP 在执行任何代码之前实际上会解析文件中的所有顶级类并立即抛出致命错误。要解决这个问题,请将您的类声明包装在if(true) { ... } 中,这将使您的类在范围内下移一个级别。那么你应该在 PHP 致命错误之前得到你的两个跟踪。

            这应该可以帮助您找到在复杂项目中多次包含您的类的位置。

            【讨论】:

              【解决方案9】:

              另一个可能的罪魁祸首是源代码控制和未解决的冲突。 SVN可能会导致同一个类在冲突的代码文件中出现两次;它的两个替代版本(“我的”和“他们的”)。

              【讨论】:

                【解决方案10】:

                如果您多次定义__construct 方法,也可能出现此错误。

                【讨论】:

                • 这应该是对已经接受且高度支持的答案的评论
                【解决方案11】:

                PHP 5.3(我认为也是旧版本)在不同情况下似乎有相同名称的问题。所以当我有类 Login 和它实现 LogIn 的接口时,我遇到了这个问题。在我将 LogIn 重命名为 Log_In 后,问题就解决了。

                【讨论】:

                  【解决方案12】:

                  只是添加;

                  如果您错误地将一个函数放入另一个函数中,也会发生此错误。

                  【讨论】:

                    【解决方案13】:

                    使用include_once(); - 这样,您的代码将只包含一次。

                    【讨论】:

                      【解决方案14】:

                      您使用 Zend 框架吗?我也有同样的问题。
                      我通过在config/application.ini 中注释掉以下行来解决它:

                      ;includePaths.library = APPLICATION_PATH "/../library"
                      

                      希望对你有所帮助。

                      【讨论】:

                        【解决方案15】:

                        我也遇到过同样的问题。发现案例是类名。我通过更改名称来处理它。从而解决问题。

                        【讨论】:

                          【解决方案16】:

                          有时会因为 PHP 的 FastCGI 中的一些错误而发生。

                          尝试重新启动它。在 Ubuntu 上是:

                          service php-fastcgi restart
                          

                          【讨论】:

                          • 好的,这是一个解决方案,但它并不能纠正问题。在我的情况下,这个问题每个月随机出现一到两次。 :(
                          • @SkaJess - 您可以将重启命令添加到 crontab 以每小时重启一次。脏 - 但会确保您网站的最长停机时间为 1 小时。
                          • @how - 这对我来说不是一个好的解决方案,因为 php 在工作日会崩溃。我认为以一种方式,我会在晚上每天添加重新启动命令。第二种方式,我会考虑升级IIS和PHP。
                          【解决方案17】:

                          如果我们使用 php 库中的任何内置类,就会发生这种情况。我使用类名作为目录,我得到了同样的错误。如果您遇到错误,请首先确保您使用的类名不是内置类之一。

                          【讨论】:

                          • 对我来说这里的黄金答案 - 我什至不认为 PHP 可能与我使用的类名相同!
                          【解决方案18】:

                          你有一个同名的类被声明了不止一次。也许通过多个包含。当包含其他文件时,您需要使用类似

                          include_once "something.php";
                          

                          以防止多重包含。这很容易发生,尽管并不总是很明显,因为您可能会有一长串文件被彼此包含。

                          【讨论】:

                          • 这真的很有帮助!
                          • avoid include_once,它很慢,用别的东西代替,比如autoloading :)
                          • @Timo 根据我查看的基准,如果您有一个包含 100,000 个 include_once 的文件,则只有大约 1 秒的明显差异。您最好优化您的数据库访问或其他逻辑,而不是过早地优化您的文件包括使用不合标准的技术(如主包含文件)。自动加载功能的表现并没有明显不同。每个功能都不同,并且不能互换使用。您可以将一个用于另一个,但在某些极端情况下它们的功能并不相同。
                          • @Timo 引用您链接的页面“不鼓励使用 __autoload(),将来可能会弃用或删除。”
                          • @AaronLS 无法在 SO 上编辑 cmets,该链接还链接到 better example。在阅读了 APC 的开发人员 cmets 以及他多么讨厌 include_once (我为他感到难过)之后,我提出了这个建议。此外,差异不仅仅是性能。
                          【解决方案19】:

                          这意味着你已经创建了一个类。

                          例如:

                          class Foo {}
                          
                          // some code here
                          
                          class Foo {}
                          

                          第二个 Foo 会抛出错误。

                          【讨论】:

                          • 这个答案不如 AaronLS 的有用。我不认为提问者会问这个问题,如果他写了这样一个明显的重复(即使在相当复杂的情况下)。 include_once 提示有助于澄清 PHP 的一个晦涩的特性。
                          • 多次定义__construct方法也可能出现此错误。
                          • 只需使用 include_once('FooBar.php') 来包含您的课程。该函数的名称是不言自明的。
                          • AaronLS 的回答评分要高得多,你可以找到它way down here。
                          • 实际上这完美地回答了这个问题,而且它是永恒的,AaronLS 做了一个假设,然后尝试解决现在可以通过许多更好的方式解决的问题。
                          猜你喜欢
                          • 2014-11-07
                          • 2013-07-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-05-22
                          • 1970-01-01
                          • 2016-06-21
                          相关资源
                          最近更新 更多