我使用的都是php __autoload狀態自動加載類的,今天好好的程序不知道怎麼在運行時提示Fatal error: Cannot redeclare class 了,看是重復定義了類,下面我來分析一下解決辦法。
錯誤提示
Fatal error: Cannot redeclare class ….
從字面來看也很好理解,說明是重復定義了類,找了一下自己的代碼,是因為存在同名的類導致的,修改了類名就好了。
原因分析
1.在同一個文件中重復聲明了兩次同名的類:
例如:
代碼如下 復制代碼 <?php
在第二個 Foo 的地方就會報錯。
解決:去掉第二個Foo,或者重命名。
為了防止重復定義,可以在定義一個新的類的時候判斷一下這個類是否已經存在:
代碼如下 復制代碼 if(class_exists('SomeClass') != true)
2.重復包含相同的類文件:
例如:對於某個類文件some_class.php,在a.php中
代碼如下 復制代碼include "some_class.php";
include "some_class.php";
在b.php中
代碼如下 復制代碼
include "a.php";
include "some_class.php";
include "a.php";
include "some_class.php";
就會報錯。
解決:將上述的include全部替換為include_once
3.該類為PHP類庫中內置的類。
判斷方法:在一個空文件中寫入
代碼如下 復制代碼 <?php
這時候提示Cannot redeclare class Com,說明這個類就是PHP內置的類。不能使用。
另外,要避免使用太大眾化的類名,比如Com,這個類在Linux使用可能是正常的,在Windows環境卻無法運行。
再記一個網上找到的解決方法,可能在某些場合有用,先記著
if (!class_exists('pageModule')){
require_once(PATH_site.'fileadmin/scripts/class.page.php');
}
上面的辦法不適用於使用了php __autoload類加載的方法 ,但己經可以解決辦法問題了,__autoload是自動加載的我們只要把相同類名找出來然後重命名即可。