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

PHP致命错误:无法重新声明类,php,class,fatal-error,Php,Class,Fatal Error,有人知道是什么导致了这个问题吗 PHP致命错误:无法重新声明类 这意味着您已经创建了一个类 例如: class Foo {} // some code here class Foo {} 第二个Foo将抛出错误。您多次声明了同名的类。可能通过多个包含。当包含其他文件时,您需要使用 include_once "something.php"; 防止多重夹杂。这种情况很容易发生,尽管并不总是显而易见,因为可能会有一长串文件被彼此包含。当您在一个页面中多次声明一个类时,就会发生这种情况。 您可以

有人知道是什么导致了这个问题吗

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


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

例如:

class Foo {}

// some code here

class Foo {}

第二个Foo将抛出错误。

您多次声明了同名的类。可能通过多个包含。当包含其他文件时,您需要使用

include_once "something.php";

防止多重夹杂。这种情况很容易发生,尽管并不总是显而易见,因为可能会有一长串文件被彼此包含。

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


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

有时,由于PHP的FastCGI中存在一些错误,会出现这种情况

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

service php-fastcgi restart

我也遇到过同样的问题。发现案例就是类名。我通过改变名字来处理它。因此解决了问题。

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

您使用Zend Framework了吗?我也有同样的问题。
我在
config/application.ini
中注释掉了这一行,从而解决了这个问题:

;includePaths.library = APPLICATION_PATH "/../library"
我希望这会对你有所帮助。

只是补充


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

PHP5.3(我认为也是旧版本)在不同的情况下似乎有相同名称的问题。因此,当a拥有类登录和它实现的接口登录时,我遇到了这个问题。在我将登录名重命名为Log_后,问题得到解决。

如果多次定义
\u构造方法,也可能发生此错误。

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

此函数将打印一个堆栈,告诉您从何处调用它:

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>';
}
函数PrintTrace(){
$trace=debug_backtrace();
回声';
$sb=数组();
foreach($trace as$item){
如果(isset($item['file'])){
$sb[]=htmlspecialchars($item[文件]:$item[行]);
}否则{
$sb[]=htmlspecialchars($item[class]:$item[function]);
}
}
回波内爆(“\n”,$sb);
回声';
}
在包含类的文件顶部调用此函数

有时它只打印一次,即使您的类被包含了两次或更多次。这是因为PHP实际上在执行任何代码之前解析文件中的所有顶级类,并立即抛出致命错误。为了解决这个问题,将类声明包装在
if(true){…}
中,这将使类在作用域中向下移动一个级别。然后,您应该在PHP致命错误之前获得两个跟踪


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

我在使用
自动加载时遇到了相同的问题,如下所示:

namespace testClassNamespace;


class MyClass1
{

    function  __construct()
    {
        echo "MyClass1 constructor";
    }
}

解决方案是保持名称空间的兼容性,在我的示例中是
namespace testClassNamespace

我遇到了相同的问题: 较新的php版本不能处理同一文件的多个incluse(作为一个库),因此现在我必须通过一些include\u一次性更改所有include

或者,如果你的图书馆里没有太多的课程,这些技巧可能会有所帮助

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

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

下面是一个简单的技巧

我用以下方法解决了这个问题。希望这能对你有所帮助

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

只要在包含或需要文件名时做一件事,即class.login.php。您可以通过以下方式将其包括在内:

这样它就不会抛出错误。

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

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

第一个解决方案: 在整个项目中查找并确保只有一个类XYZ.php

第二种解决方案:
在类中添加名称空间,以便可以使用相同的类名。

必须使用require\u once()函数。

这真是帮了大忙!,它的速度很慢,请改用其他方法,比如:)@Timo根据我看过的基准测试,如果你有一个包含100000个include_的文件,则只有大约1秒的显著差异。您最好优化您的数据库访问或其他逻辑,而不是使用诸如主包含文件之类的不符合标准的技术过早地优化您的文件包含。自动加载功能的执行方式没有明显不同。每个功能都不同,并且不可互换。您可以将一个用于另一个,但在某些情况下,它们的功能不同。@Timo引用您链接的页面“使用_autoload()是不鼓励的,将来可能会被弃用或删除。”@AaronLS无法编辑评论,因此,该链接还链接到。我是在阅读了APC的开发者评论以及他有一次是多么讨厌include_之后提出这个建议的(我为他感到难过)。另外,区别不仅仅在于性能。这可以使用APC+autload进行附加,请参见使用自动加载,或者如果(!class_exists('YourClass')){include'YourClass.php';}
它的class_exists('TestClass')==false或!@Jens AndréKoch注释中的class_exist('TestClass')在第二个示例-->它是
class_exi中缺少一个“s”
if( class_exists('TestClass') != true )
{
   //your definition of TestClass
}
if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
include_once class.login.php or 
require_once class.login.php