찾다
php教程php手册PHP MVC框架之加载器学习笔记

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

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

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

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

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

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

实例代码如下:

<?php
if (!function_exists(&#39;load&#39;)) {
    function load($name, $type = &#39;model&#39;, $data = array()) {
        static $loader = NULL;
        if (is_null($loader)) {
            include (ROOT . &#39;/system/core/loader.php&#39;);
            $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  试试看吧...


教程网址:

欢迎收藏∩_∩但请保留本文链接。

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경