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生成HTML静态页面实例代码
Aug 31 PHP
php页面防重复提交方法总结
Nov 25 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
C#静态方法与非静态方法实例分析
Sep 22 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
Jan 05 PHP
php实现中文转数字
Feb 18 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
PHP实现非阻塞模式的方法分析
Jul 26 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 PHP
浅谈php常用的7大框架的优缺点
Jul 20 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发送邮件类代码附详细说明
2008/07/10 PHP
PHP Reflection API详解
2015/05/12 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
用javascript实现页面打印的三种方法
2007/03/05 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
python实现探测socket和web服务示例
2014/03/28 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
成龙霸王洗发水广告词
2014/03/14 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
会计核算科岗位职责
2014/03/19 职场文书
质量承诺书格式
2014/05/20 职场文书
民间个人借款协议书
2014/09/30 职场文书
入团介绍人意见范文
2015/06/04 职场文书
实验室安全管理制度
2015/08/05 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js