Yaf框架下類的自動加載

      前面兩篇博客分別講述了PHP自帶的類加載和composer中類的自動加載,其實Yaf框架也實現了基於PSR0和PSR4的類的自動加載。根據我對Yaf下類的自動加載方式的理解寫下這篇博客。由於接觸Yaf框架時間不長,因此如果有不對之處,還望大家不吝指教。

  要理解Yaf框架下類的自動加載方式,還是需要PSR0和PSR4規範作爲基礎,對於PSR0和PSR4的具體規範,本文不做詳細解釋。Yaf下類的自動加載可以分爲全局類和本地類的自動加載、與MVC框架相關的類的自動加載,下面分別做相應的介紹。

  一、Yaf中全局類、本地類的自動加載

  首先,說明一下本文中所說的全局類和本地類的區別。

  全局類是所謂的公司或部門級別的現有類庫,該類可以在多個項目中共同使用,而不只在當前的項目中可用。這些類的路徑一般是通過在yaf.liabrary在php的配置文件php.ini中指定。

  本地類指的是隻應用於本項目的類,這些類所在的路徑也可以通過在Yaf的配置文件中通過ap.liabrary指定。在Yaf中可以通過Yaf_Loader::registerLocalNamespace()申明那些本地類的前綴,那麼帶有該前綴的類,需要在本地的類庫中加載。

  無論是全局類還是本地類,Yaf中使用PSR0規則進行加載的時候,類名中的"_"都會被轉換成目錄分隔符“/”。

  根據所看過的博客,全局類和本地類的加載規則可總結如下:

  1. 如果指定yaf.library和產品的application.ini中指定ap.library,那麼無論是否在application.ini中指定了ap.library.namespace或者通過Yaf_Loader::registerLocalNamespace()註冊本地的命名空間前綴,那麼在程序中遇到未定義的類的時候,會自動到ap.directory.library中尋找對應的類。(ap.directory.library是Yaf必不可少的配置,該配置指定了項目的絕對路徑地址)
  2. 如果在產品的application.ini文件中指定了本地的ap.library,但是卻沒有通過ap.library.namespace或者Yaf_Loader::registerLocalNamespace()指定本地的命名空間,那麼無論是都指定了yaf.library,都會去yaf.library中加載類;
  3. 只有在指定了本地類的ap.library,指定了本地的命名空間且類名中包含有命名空間的前綴的時候,纔回去本地的類庫中加載對應的類;否則到yaf.library中指定的文件中加載對應的類。指定命名空間的方式爲;
$loader = Yaf_Loader::getIgnstance();
$loader->registerLocalNamespace(array("local"));

        或者在項目中的conf/application.ini中指定ap.library.namespace爲local確定本地的命名空間。

        下面以類名local_sublocal_test.php說明上面三種情況分別對應的加載規則。

  1. 這種情況下,ap.directory一般在application.ini指定爲APP_PATH(APP_PATH在入口文件index.php中定義),此時的加載路徑爲APP_PATH/library/local/sublocal/test.php;
  2. 這種情況下加載路徑一般是yaf.library+'/local/sublocal/test.php';
  3. 這種情況下加載路徑爲ap.library+'/local/sublocal/test.php';

  二、與MVC框架相關的類的自動加載

  與MVC框架相關的類的的自動加載是通過使用特定的前綴或者後綴名確定類的加載路徑的,通過類與其所在的文件的特定映射完成類的自動加載:類名=文件名+後綴。

  對於控制器 Controller 默認模塊下爲{項目路徑}/controllers/, 否則爲{項目路徑}/modules/{模塊名}/controllers。例如,IndexController,該類自動加載文件 {項目目錄}/Controllers/Index.php。

  對於Model 加載路徑爲{項目目錄}/models/, 類似比如UserModel則自動加載{項目目錄}/models/User.php。

  對於和V相關的視圖文件不屬於本文的討論範圍。

  總結:本文是對Yaf中類的自動加載規則的總結,由於目前使用到的最多的就是和MVC相關的類的加載和在conf/application.ini中指定加載路徑的類,因此只討論這兩種情況。其他的在項目路徑中加載別的類的方式,在以後用到之後再和大家一起討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章