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 相关文章推荐
编写漂亮的代码 - 将后台程序与前端程序分开
Apr 23 PHP
php mysql索引问题
Jun 07 PHP
抓取并下载CSS中所有图片文件的php代码
Sep 26 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
php中的比较运算符详解
Oct 28 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
10个超级有用值得收藏的PHP代码片段
Jan 22 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 PHP
使用URL传输SESSION信息
Jul 14 PHP
php web环境和命令行环境下查找php.ini的位置
Jul 17 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
Nov 10 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的库,结果发现很多东西
2006/12/31 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
前端必学之PHP语法基础
2016/01/01 PHP
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
python多线程threading.Lock锁用法实例
2014/11/01 Python
Python全排列操作实例分析
2018/07/24 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
python读取ini配置文件过程示范
2019/12/23 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
C# .NET面试题
2015/11/28 面试题
迷你西餐厅创业计划书范文
2013/12/31 职场文书
岗位安全生产责任书
2014/07/28 职场文书
火锅店的活动方案
2014/08/15 职场文书
本溪关门山导游词
2015/02/09 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
小孩不笨观后感
2015/06/03 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫