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”。
我有两个目录,如controller
和model
,我在两个目录中错误地上传了 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 [重复]
Laravel 8 Custom Helper function PHP致命错误:无法重新声明以前在C:(path)Helpers.php中声明的functionName() [重复]