有谁知道会导致这个问题的原因吗?
PHP致命错误:无法重新声明类
if(!class_exists('YourClass')){ include 'YourClass.php'; }
有谁知道会导致这个问题的原因吗?
PHP致命错误:无法重新声明类
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Answers:
这意味着您已经创建了一个类。
例如:
class Foo {}
// some code here
class Foo {}
第二个Foo将抛出错误。
您有多次声明的同名类。也许通过多个包含。当包含其他文件时,您需要使用类似
include_once "something.php";
防止多个夹杂物。这很容易发生,尽管并不总是很明显,因为您可能会包含一长串文件。
当您在页面中多次声明一个类时,就会发生这种情况。您可以通过用if语句包装该类(如下所示)来解决该问题,也可以将其放入单独的文件中并使用require_once()
代替include()
。
if (!class_exists('TestClass')) {
// Put class TestClass here
}
class_exists('TestClass') === false
或!class_exists('TestClass')
有时由于PHP的FastCGI中的一些错误而发生。
尝试重新启动它。在Ubuntu,它是:
service php-fastcgi restart
我在使用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 5.3(我认为也是旧版本)似乎在不同情况下具有相同名称的问题。因此,当一个类具有Login和它实现LogIn的接口时,我遇到了这个问题。将LogIn重命名为Log_In之后,问题得到解决。
此函数将打印一个堆栈,告诉您从何处调用它:
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致命错误之前得到两条跟踪记录。
这应该可以帮助您从一个复杂的项目中多次查找您的班级所在的位置。
另一个可能的罪魁祸首是源代码控制和未解决的冲突。SVN可能导致同一类在冲突的代码文件中出现两次;它的两个替代版本(“我的”和“他们的”)。
我遇到了同样的问题:较新的php版本在处理同一个文件的多个包含项时(作为库)不能处理相同的问题,因此现在我必须通过include_once更改所有包含。
如果您的图书馆没有太多的课,或者这招可能会有所帮助...
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
我遇到了同样的问题“ PHP致命错误:无法重新声明类XYZ.php”。
我有两个目录,例如controller
和model
,我在两个目录中都错误地上传了XYZ.php。(因此,文件名相同会导致问题)。
查找整个项目,并确保只有一个类XYZ.php。
在您的类中添加一个名称空间,以便您可以使用相同的类名。
实际上,这意味着该类已经在页面中声明,并且您正在尝试重新创建它。
一种简单的技术如下。
我用以下方法解决了这个问题。希望这会对您有所帮助。
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}