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 相关文章推荐
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
php获取域名的google收录示例
Mar 24 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
php 实现进制相互转换
Apr 07 PHP
Yii2.0预定义的别名功能小结
Jul 04 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
php 二维数组快速排序算法的实现代码
Oct 17 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+MSSQL分页的例子
2006/10/09 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
php页面防重复提交方法总结
2013/11/25 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP进程通信基础之信号
2017/02/19 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
浅析vue中常见循环遍历指令的使用 v-for
2018/04/18 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
Linux常见面试题
2016/10/04 面试题
企业演讲稿范文
2013/12/28 职场文书
司机工作自我鉴定
2014/09/19 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2014年工会工作总结
2014/11/12 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书