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

Jin*_*ong 162 php class fatal-error

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

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

Aar*_*nLS 316

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

include_once "something.php";
Run Code Online (Sandbox Code Playgroud)

防止多重夹杂物.这很容易发生,虽然并不总是很明显,因为你可以将一长串文件相互包含在内.

  • @Timo根据我看过的基准测试,如果你有一个包含100,000个include_once的文件,那么只会有大约1秒的显着差异.最好优化数据库访问或其他逻辑,而不是过早优化文件包括使用不合标准的技术,如主包含文件.自动加载功能的性能差异不同.每个功能都不同,并且不可互换.您可以将一个用于另一个,但是有些情况下它们的功能不同. (21认同)
  • 这真的很有帮助! (10认同)
  • [避免include_once](http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html),它很慢,使用别的东西,比如[autoloading](http:/ /php.net/manual/en/language.oop5.autoload.php):) (4认同)
  • @Timo要引用您使用__autoload()链接的页面,不建议将来弃用或删除." (3认同)

whi*_*dan 117

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

例如:

class Foo {}

// some code here

class Foo {}
Run Code Online (Sandbox Code Playgroud)

第二个Foo会抛出错误.

  • 这个答案没有AaronLS那么有用.我不认为提问者会问这样一个问题,即他是否写过这样一个明显的重复(即使是在相当复杂的情况下).include_once提示有助于澄清PHP的一个不起眼的功能. (73认同)
  • 只需使用include_once('FooBar.php')来包含您的类.函数的名称是不言自明的. (4认同)
  • 如果多次定义__construct方法,也可能会发生此错误. (2认同)
  • AaronLS的答案要高得多,你可以在这里找到它(http://stackoverflow.com/questions/708140/php-fatal-error-cannot-redeclare-class/708150#708150). (2认同)

Sam*_*Sam 55

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

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
Run Code Online (Sandbox Code Playgroud)

  • 它是class_exists('TestClass')=== false或!class_exist('TestClass') (5认同)
  • 在@Jens-AndréKoch注释中,第二个例子中缺少"s" - >它是`class_exists('TestClass')=== false`或`!class_exists('TestClass')` (2认同)

小智 20

使用include_once();- 使用此功能,您的代码只会包含一次.


小智 15

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


Yon*_*rny 12

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

  • 这应该是对已经被接受和高度赞同的答案的评论 (2认同)

luc*_*nov 8

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

尝试重新启动它.在Ubuntu它是:

service php-fastcgi restart
Run Code Online (Sandbox Code Playgroud)


Jac*_*cob 6

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

<?php

function __autoload($class_name)
{
    include $class_name . '.php';
}


__autoload("MyClass1");

$obj = new MyClass1();

?>
Run Code Online (Sandbox Code Playgroud)

在其他课堂上有:

namespace testClassNamespace;


class MyClass1
{

    function  __construct()
    {
        echo "MyClass1 constructor";
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案是namespace testClassNamespace;在两个文件的示例中保持命名空间兼容性.