萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> PHP MVC框架之加載器學習筆記

PHP MVC框架之加載器學習筆記

本文章來給各位介紹PHP MVC框架之加載器學習筆記,有需要了解的朋友可進入參考。

上節說了MVC的路由原理,這節我們來說說MVC框架的loader,也稱為加載器。

雖然不同的框架,加載器的用法不同,但是其原理都是相通的。。。都是通過單例模式加載文件,而且把已加載的文件cache起來,避免重復加載。。。因為在開發業務的過程中,常常需要加載不同的模塊,不同的類庫等,MVC的loader可以幫助我們實現單例模式,更加符合開發需求。

下面我們開始動手,利用其原理,做一個簡單的loader。


首先,我們設計的加載器,要滿足可以全局使用,無論在controller裡還是在model、library裡都可以使用。

其次,加載器要有緩存能力,即相同的文件只加載一次,相同的類只實例化一次。

最後,要能加載多種文件,model、library、helper。

先解決第一步,怎麼全局使用,最簡單的辦法就是定義一個全局的function,這樣,在後面的不同類庫,不同function裡都可以調用這個全局function,進行加載文件。

第二步和第三步,要一起解決,定義一個單例模式的loader類,因為是單例模式,可以保證全局只有一份內容,這樣的話,就可以利用數組把這些已加載的內容和對象cache起來,這樣就可以避免了重復加載的問題。。。

 代碼如下 復制代碼 if ( ! function_exists(‘load’))  
{  
    function load($name, $type=’model’, $data=array())  
    {  
        static $loader = NULL;  
        if (is_null($loader))  
        {  
            include (ROOT.’/system/core/loader.php’);  
            $loader = Loader::get_instance();  
        }  
 
        return $loader->$type($name, $data);  
    }  

上面這個,就是我寫的一個簡單的全局函數 load,這個函數的作用就是為了可以全局調用,然後通過這個load函數,去調用loader類,由loader類負責加載文件,實例化,和緩存對象。。。下面我把loader的代碼放出來給大家看看。

 代碼如下 復制代碼 <?php  
 
class Loader  
{  
    private $_loaded_models = array();  
    private $_loaded_librarys = array();  
    private static $OBJ;  
 
    # 單例模式,不允許new對象  
    private function __construct()  
    {  
 
    }  
 
 
    public static function get_instance()  
    {  
        if (is_null(self::$OBJ))  
        {  
            $class = __CLASS__;  
            self::$OBJ = new $class;  
        }  
          
        return self::$OBJ;  
    }  
 
    public function model($model, $data=array())  
    {  
        $model = strtolower($model);  
 
        # 如果已經加載,則返回對象,避免重復加載  
        if (isset($this->_loaded_models[$model]))  
        {  
            return $this->_loaded_models[$model];  
        }  
 
        # 否則加載文件  
        include ROOT.“/application/models/{$model}.php”;  
 
        $class = ucfirst($model);  
        # 實例化對象  
        if (emptyempty($data))  
        {  
            $instance = new $class;  
        }  
        else 
        {  
            $instance = new $class($data);  
        }  
        # 把對象cache起來  
        $this->_loaded_models[$model] = $instance;  
 
        return $instance;  
    }  
 
 
    public function library($library, $data=array())  
    {  
        $library = strtolower($library);  
 
        # 如果已經加載,則返回對象,避免重復加載  
        if (isset($this->_loaded_librarys[$library]))  
        {  
            return $this->_loaded_librarys[$library];  
        }  
 
        # 否則加載文件  
        include ROOT.“/application/librarys/{$library}.php”;  
 
        $class = ucfirst($library);  
        # 實例化對象  
        if (emptyempty($data))  
        {  
            $instance = new $class;  
        }  
        else 
        {  
            $instance = new $class($data);  
        }  
          
        # 把對象cache起來  
        $this->_loaded_librarys[$library] = $instance;  
 
        return $instance;  
    }  
 
 
}  
 
 
 
?> 

大家看到了沒有,這個loader采用的是單例模式,雖然前面的function的設計已經可以保證不會重復實例化loader這個對象,但是為了真正可以保證全局只有一份loader對象,設計成單例模式是最保險的。。。

具體的測試例子請看代碼。。。我把代碼打包上傳上來,有需要的就下載回去看看吧。。。下載後,解壓,把lesson2文件夾放到你的www目錄下,然後訪問yourdomain/MVC/lesson2/index.php/index/test  試試看吧。。。

copyright © 萬盛學電腦網 all rights reserved