167

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

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

4

19 回答 19

318

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

include_once "something.php";

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

于 2009-04-02T03:15:45.673 回答
119

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

例如:

class Foo {}

// some code here

class Foo {}

第二个 Foo 会抛出错误。

于 2009-04-02T03:15:02.867 回答
57

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

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
于 2009-04-02T03:46:28.813 回答
20

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

于 2011-07-15T08:21:41.620 回答
15

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

于 2010-01-30T10:44:43.777 回答
12

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

于 2012-07-08T13:32:55.897 回答
8

有时这是由于 PHP 的 FastCGI 中的一些错误而发生的。

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

service php-fastcgi restart
于 2011-07-04T00:37:51.023 回答
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";
    }
}

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

于 2013-09-12T09:26:05.353 回答
3

只需添加;

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

于 2011-11-23T12:11:49.700 回答
3

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

于 2012-04-20T23:52:04.993 回答
3

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

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

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

于 2016-06-20T09:10:38.840 回答
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 致命错误之前得到你的两个跟踪。

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

于 2013-07-18T18:07:34.080 回答
1

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

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

我希望这能帮到您。

于 2011-11-14T09:55:08.417 回答
1

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

于 2012-10-23T11:10:06.050 回答
1

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

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

if( class_exists('TestClass') != true )
{
   //your definition of TestClass
}
于 2014-11-12T10:54:49.763 回答
1

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

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

第一个解决方案:

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

第二种解决方案:

在您的类中添加一个命名空间,以便您可以使用相同的类名。

于 2017-04-11T12:27:53.997 回答
0

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

于 2011-07-04T11:35:35.747 回答
0

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

一个简单的技术如下。

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

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
于 2014-12-25T05:19:39.960 回答
0

您必须使用 require_once() 函数。

于 2020-11-04T22:03:12.770 回答