2011-11-22 142 views
0

我知道这已在之前得到解答,以及为什么会造成这种情况。不过,就我而言,问题只发生在php 5.3.6上的MacOS Lion(10.7)上。相同的代码库在我的windows 7上运行在php 5.3.8上。致命错误:无法重新声明DbBase类

我已经使用require_once到处都是。代码片段,似乎是导致问题是:

class DbBase 
{ 
    ... 
} 

在包含多个文件的文件中。

if (class_exists('DbBase') != true) 
{ 
    class DbBase 
    { 
     ... 
    } 
} 

我有这样的场景:

文件DBBase.php:

defines Class DBBase 

文件A_DB.php:

require_once("DBBase.php") 
但是如果我包里面的类声明错误消失

文件B_DB.php:

require_once("DBBase.php") 

文件foo.php:

require_once("A_DB.php") 
require_once("B_DB.php) 

所以文件DBBase.php并得到包括两次。可以?

任何洞察力是赞赏。

+0

“不能重新声明类”错误不太可能是由此代码引起的,因为它似乎没有声明任何类。我建议发布完整的错误消息和它引用的文件/行。 – StasM

+0

你是对的,我的道歉。有问题的代码确实是一个类定义。但是,除非我将类定义包装在if(class_exists('ClassName')!= true)中,否则错误不会消失。 –

回答

1

当您多次声明单个类而不是一次时会发生此错误;下面的代码会抛出该错误。

class phpp{} 
class phpp{} 

5.3.6和5.3.8中的行为不可能是不一样的,因为在类和对象中没有任何重大变化。

你应该检查你的文件中的重复代码requiring once。 。 。

编辑:

放在require_once()语句是相同的要求()除了PHP会再次检查,如果该文件已经被包含,如果是这样,不包括(要求)它。

因此,在您的情况下,它不会被多次包含,而如果您使用requireinclude,则会发生这种情况。

但是,您应该重构整个代码以防止类重新声明。

class lol{} 
if(!class_exists("lol")){ 
    class lol{ 
     function ll(){ 
      return "ss"; 
     } 
    } 
} 

echo lol::ll(); 

您无法访问^^,因为它仍然是重新声明。

+0

我编辑了我的问题以包含正确的信息。我为这个错误道歉。 –

+0

@ManishGupta编辑 – Mob

+0

谢谢,我已添加必要的警卫,以防止重新宣布。它仍然击败了我,为什么这个问题没有出现在Windows上? –

3

我有同样的错误。然而,这与'多次申报一个班级'无关。这是因为我已经做了这样的班级备份: class.shipping.php class.shipping_092512_bk.php 然后,我上传备份文件到服务器。这导致应用程序由于这两个类而失败。所以,我将备份重命名为其他没有.php文件扩展名'class.shipping_092512.bk'的其他文件。问题解决了。

相关问题