簡體   English   中英

令人困惑的“無法重新聲明類”錯誤(PHP)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM