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

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

PHP Fatal error: Cannot redeclare class 

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

例如:

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

那第二个Foo会抛出这个错误。

你有一个同一个名字的类声明不止一次。 也许通过多个包括。 当包括其他文件,你需要使用类似的东西

 include_once "something.php"; 

防止多种夹杂物。 这很容易发生,尽pipe并不总是显而易见的,因为你可能有一个长链文件被包含在一起。

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

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

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

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

如果您多次定义__construct方法,也可能会发生此错误。

有时候,这是由于PHP的FastCGI中的一些错误。

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

 service php-fastcgi restart 

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

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

在其他class上有:

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

溶剂是保持命名空间的兼容性,在我的例子namespace testClassNamespace; 在这两个文件。

只是join;

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

PHP 5.3(我认为老版本)似乎有不同情况下的同名问题。 所以我有这个问题时,有一个类login和它实现LogIn的接口。 在我将LogIn重命名为Log_In之后,问题就解决了。

这个函数将打印一个堆栈,告诉你它从哪里被调用:

 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>'; } 

在包含你的类的文件顶部调用这个函数。

有时只打印一次,即使你的class级被包含两次或更多次。 这是因为在执行任何代码之前,PHP实际上会parsing文件中的所有顶级类,并立即引发致命错误。 为了解决这个问题,把你的类声明包装在if(true) { ... } ,这会把你的类移到一个范围内。 那么你应该在PHP致命错误之前得到你的两条痕迹。

这应该可以帮助您在复杂的项目中find多次包含课程的位置。

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

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

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

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

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

我希望这会帮助你。

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

我遇到了同样的问题:较新的PHP版本不会处理相同的文件(作为一个库)的多个incluse相同,所以现在我必须改变一些include_once我所有的包括。

或者这个技巧可以帮助你,如果你在图书馆里有太多的课程,

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

我有同样的问题“PHP致命错误:不能重新声明类XYZ.php”。

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

第一个scheme

find你的整个项目,并确保你只有一个类XYZ.php。

解决scheme二

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

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

我解决了以下问题。 希望这会帮助你一点。

 if(!class_exists("gt_core")) { require_once("core.db.class.php"); } 

如果您安装了硬灯,请将其卸载。 请确保您选中删除该主题的文件夹。