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

有人知道是什么导致了这个问题吗?

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

441066 次浏览

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

例如:

class Foo {}


// some code here


class Foo {}

第二个 Foo 会抛出错误。

同一名称的类声明了不止一次。也许通过多重包含。当包含其他文件时,您需要使用

include_once "something.php";

以防止多发性内含物。这种情况很容易发生,尽管并不总是显而易见,因为您可能有一个由另一个包含的长链文件。

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

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

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

有时这是由于 PHP 的 FastCGI 中的一些错误造成的。

试着重新启动它,在 Ubuntu 上它是:

service php-fastcgi restart

我也遇到过同样的问题。发现案例是类名。我改了名字。这样问题就解决了。

使用 include_once();-与此,您的代码将只包括一次。

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

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

我希望这能帮到你。

只是补充一下

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

PHP 5.3(我认为旧版本也是如此)似乎在不同的情况下有相同名称的问题。因此,当 a 具有 LogIn 类和它实现 LogIn 的接口时,我遇到了这个问题。在我将 LogIn 重命名为 Log _ In 之后,这个问题得到了解决。

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

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

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

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 致命错误之前获得两个跟踪。

这将帮助您找到您的类在复杂项目中被多次包含的位置。

我在使用 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;中,两个文件都是这样。

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

如果你的图书馆没有太多的课程,这些技巧可能会有帮助..。

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

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

一个简单的技巧如下。

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

if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}

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

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

这样它就不会抛出错误。

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

我有两个目录,如 controllermodel,我上传错误 XYZ.php 在两个目录。(因此同名文件导致问题)。

第一个解决方案:

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

第二个解决方案:

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

必须使用 request _ once ()函数。