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 for 循环语句使用方法详细说明
May 09 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
PHP获取url的函数代码
Aug 02 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
Aug 20 PHP
学习php开源项目的源码指南
Dec 21 PHP
ecshop后台编辑器替换成ueditor编辑器
Mar 03 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
Ajax实现对静态页面的文章访问统计功能示例
Oct 10 PHP
PHP中Trait及其应用详解
Feb 14 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 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
Linux编译升级php的详细方法
2013/11/04 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
php array_map()函数实例用法
2021/03/03 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
JQuery中Text方法用法实例分析
2015/05/18 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
python中的协程深入理解
2019/06/10 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
Java程序员面试题
2016/09/27 面试题
党员自我评价分享
2013/12/13 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
合作协议书范文
2014/08/20 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书