PHP Fatal error: Cannot redeclare class

該錯誤的緣由是類重複地定義了。

第一種解決方法:

是對重複定義的兩個類的其中一個重命名。

第二種方法是:

若是這些類是include/require進來的,那麼去掉多餘的include/require,或者把include/require分別改爲include_once/require_once。

注意,這兩種解決方法適用的狀況不一樣。
若是兩個php文件定義了兩個功能不一樣的類,可是名字相同,應該用第一種方法解決。
若是是不當心把同一個php文件include或者require了屢次,那麼應該用第二種方法解決。

示例:


文件C1.php內容內容以下:
<?php

class C1 {

    public function say() {
        return 'hello';
    }

}

文件test.php內容若以下:
<?php
require 'C1.php';
require 'C1.php';
會有Cannot redeclare class的錯誤。


文件test.php內容若以下:
<?php

include 'C1.php';
include 'C1.php';
會有Cannot redeclare class的錯誤。
文件test.php內容若以下:
<?php

require_once 'C1.php';
require_once 'C1.php';
或者:
<?php

include_once 'C1.php';
include_once 'C1.php';
則不會報錯。

如今新建文件C2.php,內容以下:
<?php

class C1 {

    public function say() {
        return 'hello';
    }

}
修改test.php爲如下內容:
<?php

include_once 'C1.php';
include_once 'C2.php';
會有Cannot redeclare class的錯誤。

這時候,若是不想更改C1.php和C2.php的類名,那麼能夠使用命名空間。

如C1.php內容爲:
<?php namespace foo;
class C1 {

    public function say() {
        return 'hello';
    }
}
?>



C2.php內容爲(對於純php文件,最後的?>能夠不要):
<?php namespace bar;

class C1 {

    public function say() {
        return 'hello world';
    }

}



如今建立文件C1_C2_test.php,內容以下:
<?php
require_once './C1.php';
require_once './C2.php';

$c1 = new \foo\C1();
echo $c1->say();

$c2 = new \bar\C1();
echo $c2->say();

運行結果以下: php

$ /usr/bin/php C1_C2_test.php
hellohello world


關於命名空間:

http://my.oschina.net/u/867608/blog/127351
http://my.oschina.net/Jacker/blog/32943 shell