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

Posted

技术标签:

【中文标题】PHP致命错误:无法重新声明类【英文标题】:PHP Fatal error: Cannot redeclare class 【发布时间】:2010-10-17 00:38:42 【问题描述】:

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

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

【问题讨论】:

这可以附加 APC + autload 见***.com/questions/4575341/… 使用自动加载,也可以试试if(!class_exists('YourClass')) include 'YourClass.php'; 【参考方案1】:

你必须使用 require_once() 函数。

【讨论】:

我查看了此线程中的其他答案,似乎this、this 和this 也提到了require_once()。你能解释一下你的答案有什么不同吗?【参考方案2】:

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

一个简单的技术如下。

我解决了以下问题。希望对您有所帮助。

if(!class_exists("testClassIfExist"))

    require_once("testClassIfExist.php");

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

第一个解决方案:

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

第二种解决方案:

在你的类中添加一个命名空间,这样你就可以使用相同的类名。

【讨论】:

【参考方案5】:

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

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

【讨论】:

这是 class_exists('TestClass') === false 或 !class_exist('TestClass') 在@Jens-AndréKoch 评论中,第二个示例中缺少“s” --> 它是class_exists('TestClass') === false!class_exists('TestClass') 是的。感谢您指出了这一点。不再可编辑.. 超时。 感谢这个逻辑。【参考方案6】:

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

如果你的库中没有太多类的话,这些技巧会有所帮助......

if( class_exists('TestClass') != true )

   //your definition of TestClass

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

如果您多次定义__construct 方法,也可能出现此错误。

【讨论】:

这应该是对已经接受且高度支持的答案的评论【参考方案11】:

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

【讨论】:

【参考方案12】:

只是添加;

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

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

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

希望对你有所帮助。

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

有时会因为 PHP 的 FastCGI 中的一些错误而发生。

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

service php-fastcgi restart

【讨论】:

好的,这是一个解决方案,但它并不能纠正问题。在我的情况下,这个问题每个月随机出现一到两次。 :( @SkaJess - 您可以将重启命令添加到 crontab 以每小时重启一次。脏 - 但会确保您网站的最长停机时间为 1 小时。 @how - 这对我来说不是一个好的解决方案,因为 php 在工作日会崩溃。我认为以一种方式,我会在晚上每天添加重新启动命令。第二种方式,我会考虑升级IIS和PHP。【参考方案17】:

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

【讨论】:

对我来说这里的黄金答案 - 我什至不认为 PHP 可能与我使用的类名相同!【参考方案18】:

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

include_once "something.php";

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

【讨论】:

这真的很有帮助! avoid include_once,它很慢,用别的东西代替,比如autoloading :) @Timo 根据我查看的基准,如果您有一个包含 100,000 个 include_once 的文件,则只有大约 1 秒的明显差异。您最好优化您的数据库访问或其他逻辑,而不是过早地优化您的文件包括使用不合标准的技术(如主包含文件)。自动加载功能的表现并没有明显不同。每个功能都不同,并且不能互换使用。您可以将一个用于另一个,但在某些极端情况下它们的功能并不相同。 @Timo 引用您链接的页面“不鼓励使用 __autoload(),将来可能会弃用或删除。” @AaronLS 无法在 SO 上编辑 cmets,该链接还链接到 better example。在阅读了 APC 的开发人员 cmets 以及他多么讨厌 include_once (我为他感到难过)之后,我提出了这个建议。此外,差异不仅仅是性能。【参考方案19】:

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

例如:

class Foo 

// some code here

class Foo 

第二个 Foo 会抛出错误。

【讨论】:

这个答案不如 AaronLS 的有用。我不认为提问者会问这个问题,如果他写了这样一个明显的重复(即使在相当复杂的情况下)。 include_once 提示有助于澄清 PHP 的一个晦涩的特性。 多次定义__construct方法也可能出现此错误。 只需使用 include_once('FooBar.php') 来包含您的课程。该函数的名称是不言自明的。 AaronLS 的回答评分要高得多,你可以找到它way down here。 实际上这完美地回答了这个问题,而且它是永恒的,AaronLS 做了一个假设,然后尝试解决现在可以通过许多更好的方式解决的问题。

以上是关于PHP致命错误:无法重新声明类的主要内容,如果未能解决你的问题,请参考以下文章

phpMyAdmin:PHP 致命错误 - 无法重新声明 PMA_checkLink()

PHP:无法重新声明类 Comment::GetComment [重复]

升级到 PHP 7.0.8 后出现“致命错误:无法声明类”

Laravel 8 Custom Helper function PHP致命错误:无法重新声明以前在C:(path)Helpers.php中声明的functionName() [重复]

致命错误:无法声明类错误,因为该名称已在使用中

致命错误:无法声明类 Locale,因为该名称已在