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”。
我有两个目录,如controller
和model
,我错误地上传了两个目录中的XYZ.php(所以同名文件导致问题)。
第一个scheme
find你的整个项目,并确保你只有一个类XYZ.php。
解决scheme二
在你的类中添加一个名字空间,这样你就可以使用相同的类名。
我遇到了同样的问题。 发现案件是类名。 我通过改变名字来处理它。 因此解决了这个问题。
我解决了以下问题。 希望这会帮助你一点。
if(!class_exists("gt_core")) { require_once("core.db.class.php"); }
如果您安装了硬灯,请将其卸载。 请确保您选中删除该主题的文件夹。