有谁知道什么会导致这个问题?
PHP致命错误:无法重新声明类
答案 0 :(得分:310)
您有一个同名的类,不止一次声明。也许通过多个包括。包含其他文件时,您需要使用
之类的内容include_once "something.php";
防止多重夹杂物。这很容易发生,虽然并不总是很明显,因为你可以将一长串文件相互包含在内。
答案 1 :(得分:114)
这意味着你已经创建了一个类。
例如:
class Foo {}
// some code here
class Foo {}
第二个Foo会抛出错误。
答案 2 :(得分:55)
当您在页面中多次声明一个类时会发生这种情况。
您可以通过使用if语句(如下所示)包装该类来修复它,也可以将其放入单独的文件中并使用require_once()
,而不是include()
。
if (!class_exists('TestClass')) {
// Put class TestClass here
}
答案 3 :(得分:20)
使用include_once();
- 这样,您的代码将只包含一次。
答案 4 :(得分:15)
如果我们使用php库中的任何内置类,就会发生这种情况。我使用类名作为目录,我得到了同样的错误。如果首先出现错误,请确保您使用的类名不是内置类之一。
答案 5 :(得分:11)
如果您多次定义__construct
方法,也可能会出现此错误。
答案 6 :(得分:8)
有时这是由于PHP的FastCGI中的一些错误而发生的。
尝试重新启动它。在Ubuntu,它是:
service php-fastcgi restart
答案 7 :(得分:6)
我在使用autoload
时遇到了同样的问题,如下所示:
<?php
function __autoload($class_name)
{
include $class_name . '.php';
}
__autoload("MyClass1");
$obj = new MyClass1();
?>
在其他课程中有:
namespace testClassNamespace;
class MyClass1
{
function __construct()
{
echo "MyClass1 constructor";
}
}
sollution用于保持命名空间兼容性,在我的示例中namespace testClassNamespace;
在两个文件中。
答案 8 :(得分:3)
PHP 5.3(我认为也是旧版本)似乎在不同情况下具有相同名称的问题。所以当有一个类Login和它实现LogIn的接口时,我遇到了这个问题。在我将LogIn重命名为Log_In之后,问题就解决了。
答案 9 :(得分:3)
每当你包含或要求文件名即class.login.php时,只做一件事。您可以这样包含它:
AutoSuggestBox
这样它就不会抛出错误。
答案 10 :(得分:3)
只需添加;
如果您错误地将函数放在另一个函数中,也会发生此错误。
答案 11 :(得分:2)
此函数将打印一个堆栈,告诉您从哪里调用它:
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致命错误之前获得两条跟踪。
这可以帮助您在复杂项目中多次查找您所在的课程。
答案 12 :(得分:1)
另一个可能的罪魁祸首是源控制和未解决的冲突。 SVN可能导致同一类在冲突的代码文件中出现两次;它的两个替代版本(“我的”和“他们的”)。
答案 13 :(得分:1)
您使用的是Zend Framework吗?我也有同样的问题
我通过在config/application.ini
中注释掉以下这一行来解决它:
;includePaths.library = APPLICATION_PATH "/../library"
我希望这会对你有所帮助。
答案 14 :(得分:1)
我遇到了同样的问题: 较新的php版本对同一个文件(作为库)的多个包含不同,所以现在我必须通过一些include_once更改我的所有包含。
如果你的图书馆里有太多的课程,这个技巧可能会有所帮助......
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
答案 15 :(得分:1)
我遇到了同样的问题“PHP致命错误:无法重新声明类XYZ.php”。
我有两个目录,例如controller
和model
,我错误地将XYZ.php上传到两个目录中。(因此具有相同名称的文件会导致问题)。
在整个项目中查找并确保只有一个类XYZ.php。
在类中添加命名空间,以便使用相同的类名。
答案 16 :(得分:0)
它实际上意味着已经在页面中声明了类,并且您正在尝试重新创建它。
一种简单的技术如下。
我用以下方法解决了这个问题。希望这会对你有所帮助。
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}
答案 17 :(得分:0)
我遇到了同样的问题。发现案件是班级名称。我通过更改名称来处理它。因此解决了这个问题。
答案 18 :(得分:0)
您必须使用require_once()函数。