有人知道是什么导致了这个问题吗?
PHP 致命错误: 无法重新声明类
这意味着您已经创建了一个类。
例如:
class Foo {} // some code here class Foo {}
第二个 Foo 会抛出错误。
同一名称的类声明了不止一次。也许通过多重包含。当包含其他文件时,您需要使用
include_once "something.php";
以防止多发性内含物。这种情况很容易发生,尽管并不总是显而易见,因为您可能有一个由另一个包含的长链文件。
当您在一个页面中多次声明一个类时,就会发生这种情况。 您可以通过使用 if 语句包装该类(如下所示)来修复它,也可以将其放入一个单独的文件并使用 require_once(),而不是 include()。
require_once()
include()
if (!class_exists('TestClass')) { // Put class TestClass here }
如果我们使用 php 库中的任何内置类,就会发生这种情况。我使用类名作为 Directory,得到了相同的错误。如果出现错误,首先要确保您使用的类名不是内置类之一。
有时这是由于 PHP 的 FastCGI 中的一些错误造成的。
试着重新启动它,在 Ubuntu 上它是:
service php-fastcgi restart
我也遇到过同样的问题。发现案例是类名。我改了名字。这样问题就解决了。
使用 include_once();-与此,您的代码将只包括一次。
include_once();
你用了 Zend 框架吗? 我也有同样的问题。 我通过在 config/application.ini中注释以下行来解决这个问题:
config/application.ini
;includePaths.library = APPLICATION_PATH "/../library"
我希望这能帮到你。
只是补充一下
如果错误地将一个函数放入另一个函数中,也可能发生此错误。
PHP 5.3(我认为旧版本也是如此)似乎在不同的情况下有相同名称的问题。因此,当 a 具有 LogIn 类和它实现 LogIn 的接口时,我遇到了这个问题。在我将 LogIn 重命名为 Log _ In 之后,这个问题得到了解决。
如果多次定义 __construct方法,也可能发生此错误。
__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 致命错误之前获得两个跟踪。
if(true) { ... }
这将帮助您找到您的类在复杂项目中被多次包含的位置。
我在使用 autoload时遇到了同样的问题,如下所示:
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;中,两个文件都是这样。
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”。
我有两个目录,如 controller和 model,我上传错误 XYZ.php 在两个目录。(因此同名文件导致问题)。
controller
model
在整个项目中查找并确保只有一个类 XYZ.php。
在类中添加命名空间,以便可以使用相同的类名。
必须使用 request _ once ()函数。