[英]confusing “cannot redeclare class” error (PHP)
我有一個奇怪的問題。 我有一個加載類的靜態方法(load_library)。 當它加載一個特定的類時,它給我一個“無法重新聲明類”的致命錯誤,但是當在使用load_library方法加載該類之前測試該類是否存在時,它表示該類不存在。 load_library
方法可在其他地方使用而不會出現此類錯誤。
如果我將load_library調出,它說當稍后實際使用該類時,它找不到該類。 仍然很陌生,如果我改用我注冊的類的autoload
功能,那么即使該autoload
功能甚至不檢查我要加載的類所在的目錄,也可以正常運行。
這是一個涉及許多文件的復雜問題,因此很難發布代碼,但是周圍的任何人都不會聞到這個問題嗎?
我的load_library方法:
public static function load_library($name) {
if (!class_exists($name)) {
if (file_exists('application/libraries/' . $name . '.php')) {
include('application/libraries/' . $name . '.php');
} else {
trigger_error('Request made for non-existant library ('.$name.').', E_USER_ERROR);
}
}
}
我對load_library方法的調用:
lev::load_library('lev_unit_tester/lev_base_test');
我注冊的自動加載方法:
public static function autoloader($name) {
if (class_exists($name)) return;
if (file_exists('application/libraries/' . $name . '.php')) {
include('application/libraries/' . $name . '.php');
}
}
我正在嘗試加載的類(這是發生錯誤的地方):
abstract class lev_base_test {
}
實際的錯誤信息:
致命錯誤:無法在第5行的/some/path/application/libraries/lev_unit_tester/lev_base_test.php中重新聲明lev_base_test類
您正在以這種方式調用load_library
方法:
lev::load_library('lev_unit_tester/lev_base_test');
這意味着您正在使用class_exists()
進行測試,如果有一個名為lev_unit_tester/lev_base_test
的類-可能並非如此:這不是一個有效的類名。
所以class_exists()
返回false
; 因此,您嘗試在每次調用load_library
方法時包括包含您的類的文件。
使用自動加載時沒有問題,因為PHP僅在您嘗試使用未定義的類時才會調用自動加載器:一旦包含了與該類對應的文件,就不會調用自動加載器再次上課。
嘗試這個
// Check to see whether the include declared the class
if (!class_exists($class, false)){..}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.