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  试试看吧。。。

时间: 2024-10-17 09:50:46

PHP MVC框架之加载器学习笔记的相关文章

AMD加载器实现笔记(二)

AMD加载器实现笔记(一)中,我们实现了一个简易的模块加载器.但到目前为止这个加载器还并不能称为AMD加载器,原因很简单,我们还不支持AMD规范中的config配置.这篇文章中我们来添加对config的中baseUrl和packages的支持.API设计如下: require.config({ baseUrl: "./", packages: [{ name: "more", location: "./more" }, { name: "

Yii2框架自动加载机制学习

Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件.你可以简单的引入这个文件,你会得到一个自动加载的支持. 在之前的文章,入口文件的介绍中,我们可以看到如下内容: // 引入 vendor 中的 autoload.php 文件,会基于 composer 的机制自动加载类require(__DIR__ .

AMD加载器实现笔记(五)

前几篇文章对AMD规范中的config属性几乎全部支持了,这一节主要是进一步完善.到目前为止我们的加载器还无法处理环形依赖的问题,这一节就是解决环形依赖. 所谓环形依赖,指的是模块A的所有依赖项的依赖中有没有依赖A模块本身的模块.如果有那就说明存在环形依赖.所以检验的方式是利用递归,检查一个模块的依赖的依赖项中有没有依赖A模块,以及依赖项的依赖项的依赖项中有没有A模块,核心代码如下: function checkCircleRef(start, target){ var m = modules[

AMD加载器实现笔记(一)

代码我是有看过的,基本的原理也都明白,但实际动手去实现却是没有的.因为今年计划的dojo教程<静静的dojo>中,有一章节来专门讲解AMD,不免要把对AMD的研究回炉一下.时隔多日,再回头探索AMD实现原理时,竟抓耳挠腮,苦苦思索不得要领.作为开发人员,深感惭愧.故有此文,记录我在实现一个AMD加载器时的思考总结.   requireJS是所有AMD加载器中,最广为人知的一个.目前的版本更凝聚了几位大牛数年心血,必然不是我这个小虾米一晚上的粗制滥造能够比拟的,所以目前为止这篇文章里的加载器尚不

AMD加载器实现笔记(四)

继续这一系列的内容,到目前为止除了AMD规范中config的map.config参数外,我们已经全部支持其他属性了.这一篇文章中,我们来为增加对map的支持.同样问题,想要增加map的支持首先要知道map的语义. 主要用于解决在两个不同模块集中使用一个模块的不同版本,并且保证两个模块集的交互没有冲突. 假设磁盘有如下文件: 当'some/newmodule'请求'foo'模块时,它将从foo1.2.js总得到'foo1.2'模块:当'some/oldmodule'请求'foo'模块时它将从foo

《JavaScript框架设计》——2.2 加载器所在路径的探知

2.2 加载器所在路径的探知 要加载一个模块,我们需要一个URL作为加载地址,一个script作为加载媒介.但用户在require时都用ID,因此我们需要一个将ID转换为URL的方法.思路很简单,强加个约定,URL的合成规则为. basePath + 模块ID + ".js" 由于浏览器自上而下分析DOM,当浏览器在解析我们的JavaScript文件(这个JavaScript文件是指加载器)时,它就肯定DOM树中最后加入的script标签.因此,我们有下面这个方法. function

加快页面的载入速度:异步模块加载器In.js

文章简介:用In.js颗粒化管理.加载你的Javascript模块. 近一年来,国内外都十分热衷于异步加载的研究,为了加快页面的载入速度,无阻塞加载Javascript的方法和框架成为了前端开发的焦点和亮点之一. 国外的像基于jQuery的RequireJs,YUI Loader,LabJs,RunJs,国内也有淘宝的SeaJs,豆瓣的DoJs等,这些都是一些十分优秀的模块加载器.但是本文将会向大家介绍一个新的开源的轻量级"多线程"异步模块加载器In.js,In的开发借鉴了Do的一些思

详解js异步文件加载器_php实例

我们经常会遇到这种场景,某些页面依赖第三方的插件,而这些插件比较大,不适合打包到页面的主js里(假设我们使用的是cmd的方式,js会打包成一个文件),那么这个时候我们通常会异步获取这些插件文件,并在下载完成后完成初始化的逻辑. 以图片上传为例,我们可能会用到plupload.js这个插件,那么我们会这么写: !window.plupload ? $.getScript( "/assets/plupload/plupload.full.min.js", function() { self

配置-关于spring mvc静态资源 加载的问题

问题描述 关于spring mvc静态资源 加载的问题 浏览器报了这样的错误 然后小弟的项目里面是这样配置滴: 解决方案 第一行错误就显示jquery没找到,$肯定也就不好使了.可以在src里加上"${pageContext.request.contextPath}/"配完整路径 解决方案二: 不能用 /js 开头,应该这样写:/web工程名/js .... 这是个非常基础的问题,建议看下 html 相关知识 解决方案三: 1可能是你用的SpringMVC框架,拦截了静态资源.你检查下