当前位置:首页 > PHP教程 > php应用 > 列表

PHP MVC框架之加载器学习笔记

发布:smiling 来源: PHP粉丝网  添加日期:2014-02-27 14:18:44 浏览: 评论:0 

本文章来给各位介绍PHP MVC框架之加载器学习笔记,有需要了解的朋友可进入参考.上节说了MVC的路由原理,这节我们来说说MVC框架的loader,也称为加载器.虽然不同的框架,加载器的用法不同,但是其原理都是相通的...都是通过单例模式加载文件,而且把已加载的文件cache起来,避免重复加载...因为在开发业务的过程中,常常需要加载不同的模块,不同的类库等,MVC的loader可以帮助我们实现单例模式,更加符合开发需求.下面我们开始动手,利用其原理,做一个简单的loader.

首先,我们设计的加载器,要满足可以全局使用,无论在controller里还是在model、library里都可以使用.

其次,加载器要有缓存能力,即相同的文件只加载一次,相同的类只实例化一次.

最后,要能加载多种文件,model、library、helper.

先解决第一步,怎么全局使用,最简单的办法就是定义一个全局的function,这样,在后面的不同类库,不同function里都可以调用这个全局function,进行加载文件.

第二步和第三步,要一起解决,定义一个单例模式的loader类,因为是单例模式,可以保证全局只有一份内容,这样的话,就可以利用数组把这些已加载的内容和对象cache起来,这样就可以避免了重复加载的问题...

实例代码如下:

  1. if ( ! function_exists(‘load’))    
  2. {    
  3.     function load($name$type=’model’, $data=array())    
  4.     {    
  5.         static $loader = NULL;    
  6.         if (is_null($loader))    
  7.         {    
  8.             include (ROOT.’/system/core/loader.php’);    
  9.             $loader = Loader::get_instance();    
  10.         }    
  11.    
  12.         return $loader->$type($name$data);    
  13.     }    
  14. }   

上面这个,就是我写的一个简单的全局函数 load,这个函数的作用就是为了可以全局调用,然后通过这个load函数,去调用loader类,由loader类负责加载文件,实例化,和缓存对象...下面我把loader的代码放出来给大家看看.

实例代码如下:

  1. <?php    
  2.    
  3. class Loader    
  4. {    
  5.     private $_loaded_models = array();    
  6.     private $_loaded_librarys = array();    
  7.     private static $OBJ;    
  8.    
  9.     # 单例模式,不允许new对象    
  10.     private function __construct()    
  11.     {    
  12.    
  13.     }    
  14.      
  15.     public static function get_instance()    
  16.     {    
  17.         if (is_null(self::$OBJ))    
  18.         {    
  19.             $class = __CLASS__;    
  20.             self::$OBJ = new $class;    
  21.         }    
  22.             
  23.         return self::$OBJ;    
  24.     }    
  25.    
  26.     public function model($model$data=array())    
  27.     {    
  28.         $model = strtolower($model);    
  29.    
  30.         # 如果已经加载,则返回对象,避免重复加载    
  31.         if (isset($this->_loaded_models[$model]))    
  32.         {    
  33.             return $this->_loaded_models[$model];    
  34.         }    
  35.    
  36.         # 否则加载文件    
  37.         include ROOT.“/application/models/{$model}.php”;    
  38.    
  39.         $class = ucfirst($model);    
  40.         # 实例化对象    
  41.         if (emptyempty($data))    
  42.         {    
  43.             $instance = new $class;    
  44.         }    
  45.         else   
  46.         {    
  47.             $instance = new $class($data);    
  48.         }    
  49.         # 把对象cache起来    
  50.         $this->_loaded_models[$model] = $instance;    
  51.    
  52.         return $instance;    
  53.     }    
  54.    
  55.    
  56.     public function library($library$data=array())    
  57.     {    
  58.         $library = strtolower($library);    
  59.    
  60.         # 如果已经加载,则返回对象,避免重复加载    
  61.         if (isset($this->_loaded_librarys[$library]))    
  62.         {    
  63.             return $this->_loaded_librarys[$library];    
  64.         }    
  65.    
  66.         # 否则加载文件    
  67.         include ROOT.“/application/librarys/{$library}.php”;    
  68.    
  69.         $class = ucfirst($library);    
  70.         # 实例化对象    
  71.         if (emptyempty($data))    
  72.         {    
  73.             $instance = new $class;    
  74.         }    
  75.         else   
  76.         {    
  77.             $instance = new $class($data);    
  78.         }    
  79.             
  80.         # 把对象cache起来    
  81.         $this->_loaded_librarys[$library] = $instance;    
  82.    
  83.         return $instance;    
  84.     }    
  85.    
  86. }    
  87. ?>   

大家看到了没有,这个loader采用的是单例模式,虽然前面的function的设计已经可以保证不会重复实例化loader这个对象,但是为了真正可以保证全局只有一份loader对象,设计成单例模式是最保险的...

具体的测试例子请看代码...我把代码打包上传上来,有需要的就下载回去看看吧...下载后,解压,把lesson2文件夹放到你的www目录下,然后访问yourdomain/MVC/lesson2/index.php/index/test  试试看吧...

Tags: PHP MVC

分享到: