2009-09-17 111 views
2

我打算使用PHP的自動加載功能來動態加載所需的類文件。現在,這可以創建一個巨大的混亂,如果每一個功能都有一個單獨的文件,所以我希望和要求是有辦法有相關的類留在1個的文件,仍然是自動加載如何自動加載擴展類?

function __autoload($class_name){ 
    include('classes/' . $class_name . '.class.php'); 
} 

比方說,有一個類名爲動物,然後是另一個類名爲狗。狗課程擴展了動物課程,現在如果我打電話給狗課,但不叫動物課,那麼動物課文件是否仍然會被加載?

+0

我建議你也看看梨/ Zend的編碼標準的文件命名約定爲提供一些好的指引。恕我直言,在文件名中使用.class.php是多餘的,不鼓勵。你可以使用下面的東西來自動加載:require(str_replace('_',DIRECTORY_SEPARATOR,$ className);使其變得簡單易行 – Tres 2009-09-18 02:09:28

+0

順便說一句,每個文件有多個類一般都不被認爲是代碼可維護性的好習慣 – Tres 2009-09-18 02:13:04

+0

哈哈,對不起關於所有的評論,但fyi,我的上面的「require」行是不正確的語法。它應該是:require(str_replace('_',DIRECTORY_SEPARATOR,$ className)。'.php');應該有單元測試我的評論; ) – Tres 2009-09-18 02:16:33

回答

5

如果我是叫狗類,但 不叫動物類,將在 動物類文件仍然可以加載?

是的。在加載擴展另一個類的類時,PHP必須加載基類,以便知道擴展的內容。

re:爲每個文件存儲多個類的想法:這不適用於您提供的自動加載功能。每個文件一個類真的是最好的做法,特別是對於自動加載類。

如果你在一個文件中有多個類,你真的不應該嘗試自動加載該文件中的任何類。

0

是的,它會加載,除非你不包括/需要類文件。

您必須始終導入任何包含所需PHP代碼的文件。 PHP本身不能猜出你給你的類文件的名字。與Java不同,PHP沒有任何類文件命名要求。

解決此問題的常用方法是將相關類組合到一個文件中。創建一個「模塊」。

+0

我想你誤解了這個問題,我不是問如果php會猜測文件是在哪裏或是否被命名,我問是否有自動加載設置爲加載一個文件名爲相同的類,但然後調用一個類與類相同的文件,因爲它只是擴展類,並沒有它自己的名字 – JasonDavis 2009-09-17 23:15:46

9

你有沒有考慮過你的班級位置的明確定義?有時候將相關的類分組很有意義。

這是處理它的經過驗證的方法。

此代碼放置在auto_prepend_file(或包含第一)

class Import 
{ 
    public static $_AutoLoad = array(); 
    public static $_Imported = array(); 

    public static function Load($sName) 
    { 
     if(! isset(self::$_AutoLoad[$sName])) 
      throw new ImportError("Cannot import module with name '$sName'."); 

     if(! isset(self::$_Imported[$sName])) 
     { 
      self::$_Imported[$sName] = True; 
      require(self::$_AutoLoad[$sName]); 
     } 
    } 

    public static function Push($sName, $sPath) 
    { 
     self::$_AutoLoad[$sName] = $sPath; 
    } 

    public static function Auto() 
    { 
     function __autoload($sClass) 
     { 
      Import::Load($sClass); 
     } 
    } 
} 

而且在引導文件,定義類,它們是在什麼文件。

//Define autoload items 
Import::Push('Admin_Layout',  App::$Path . '/PHP/Admin_Layout.php'); 
Import::Push('Admin_Layout_Dialog', App::$Path . '/PHP/Admin_Layout.php'); 
Import::Push('FileClient',   App::$Path . '/PHP/FileClient.php'); 

最後,通過調用

Import::Auto() 

啓用自動加載

其中一個很好的事情是,你可以定義「模塊」:

Import::Push('MyModule',   App::$Path . '/Module/MyModule/Init.php'); 

,然後在需要時明確加載它們:

Import::Load('MyModule'); 

而最好的部分之一是,你可以有更多的Import::Push模塊中的行,它將在運行時定義它的所有類。

+0

尼斯解決方案,但在此檢查更先進的PSR-4標準,這是相同方法的擴展: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md – 2014-11-29 22:12:13

0

有一個解決辦法,我只是用它,它似乎工作:

假設我們已經存儲在animals.class.php稱爲動物的自動加載類。在同一個文件,你可以有其他類擴展動物

class animals{ 
     static function load(){ 
      return true; 
     } 
    } 


    class dogs extends animals{ 

    } 

    class cats extends animals{ 

    } 

現在...當你需要dogs你需要PHP自動加載它的父類(這樣你確定它也將解析使用你的類同一文件中的所有extendend類),所以你只需要編寫:

animals::load(); 
$fuffy = new dogs();