PHP实现懒加载的方法


Posted in PHP onMarch 07, 2015

本文实例讲述了PHP实现懒加载的方法。分享给大家供大家参考。具体分析如下:

寻常php的加载是通过include(),require()等方法来加载外部文件,之后再通过实例调用方法或直接调用静态方法,而这样子写引入语句实在很麻烦,有的框架会将特定路径的文件全部引入,直接实例化就能使用,但这样一来有的类包不一定用到,写的类包越多的时候,加载的东西就不少了,影响程序的性能。

通过PHP的反射类 ReflectionClass 可以直接获得对应类的一个反射类:

test.php文件如下:

<?php
 class test{
   public function showName(){
     var_dump(__CLASS__);
   }
 }
?>

index.php文件如下:

<?php
var_dump(get_included_files()); 
$rf = new ReflectionClass('test');
var_dump(get_included_files());
$testObj = $rf->newInstance();
$testObj->showName();
function __autoload($classname){
  $classpath = './' . $classname . '.php';
  if (file_exists($classpath)) {
    require_once($classpath);
  }else {
    echo 'class file'.$classpath.'not found!';
  }
}
?>
//array
// 0 => string 'D:\code\www\test\index.php'(length=26)
//array
// 0 => string 'D:\code\www\test\index.php'(length=26)
// 1 => string 'D:\code\www\text\test.php'(length=25)
//string 'test' (length=4)

实例化一个 ReflectionClass,并传类名进去,就会得到一个对应类的反射类。用实例调用 newInstance就会得到反射类的实例,这样就完成了实例化。

通过 get_included_files() 方法,我们可以看到当前页面引入的文件。在实例化反射类前,只有index.php文件,实例化反射类后,自动引入了一个test.php文件,那么看下上面那段代码,发现有个__autoload()名字的魔术方法,这方法就定义了自动加载文件,而ReflectionClass在当前页面找不到类时,就会调用__autoload()去加载类。这就是自动加载的过程。

想知道__autoload()方法有没有开启,可以通过PHP的标准库SPL中的方法来查看:

var_dump(spl_autoload_functions());
spl_autoload_register('newAutoload');
var_dump(spl_autoload_functions());
$testObj1 = getInstance('test');
$testObj2 = getInstance('test');
$testObj3 = getInstance('test');
function getInstance($class, $returnInstance = false){
  $rf = new ReflectionClass($class);
  if ($returnInstance)
     return $rf->newInstance();
}
function newAutoload($classname){
  $classpath = './' . $classname . '.php';
  if (file_exists($classpath)) {
    var_dump('require success');
    require_once($classpath);
  } else {
    echo 'class file ' . $classpath . ' not found!';
  }
}
//array
// 0 => string '__autoload' (length=10)
//array
// 0 => string 'newAutoload' (length=11)
//string 'require success' (length=15)

sql_autoload_functions() 方法是用来查看当前自动加载的方法,当前有个__autoload魔术方法,所以返回了函数名,若没定义自动加载方法的话,返回的是false,而 spl_autoload_register() 方法是通过方法名将一个方法注册到自动加载方法,这里用newAutoload方法来替换__autoload方法。

newAutoload方法中,每执行成功一次,打印一句'require success',这里只打印了一次,说明了虽然实例了3次ReflectionClass('test'),但因为test类已经加载过一次,就不会再执行自动加载的方法。通过getInstance()这种加载类的方法,比以前的include()之类的方便多了,只需要加载这个写了getInstance()方法的文件就可以了。

重写的自动加载方法可以根据需要,通过判断类的名字,定义不同的文件路径。getInstance可以用静态变量保存实例,这也是使用到了设计模式中的单例模式。

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
Sep 09 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 PHP
php 5.6版本中编写一个PHP扩展的简单示例
Jan 20 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
详解PHP序列化和反序列化原理
Jan 15 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 #PHP
PHP多线程编程之管道通信实例分析
Mar 07 #PHP
PHP查询快递信息的方法
Mar 07 #PHP
php实现汉字验证码和算式验证码的方法
Mar 07 #PHP
php实现俄罗斯乘法实例
Mar 07 #PHP
php实现发送微信模板消息的方法
Mar 07 #PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
Mar 07 #PHP
You might like
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
JavaScript Event事件学习第一章 Event介绍
2010/02/07 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
python实现梯度下降法
2020/03/24 Python
python实现数字炸弹游戏
2020/07/17 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书