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写的小东西
Dec 06 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
一个PHP二维数组排序的函数分享
Jan 17 PHP
PHP递归删除目录几个代码实例
Apr 21 PHP
PHP调用C#开发的dll类库方法
Jul 28 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
php 无限级分类 获取顶级分类ID
Mar 13 PHP
php文件上传类完整实例
May 14 PHP
php传值方式和ajax的验证功能
Mar 27 PHP
php如何比较两个浮点数是否相等详解
Feb 12 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 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抽象方法和抽象类实例分析
2016/12/07 PHP
php服务器的系统详解
2019/10/12 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
2020/03/26 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
python中列表的含义及用法
2020/05/26 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
请说出几个常用的异常类
2013/01/08 面试题
Ruby如何创建一个线程
2013/03/10 面试题
环境科学专业研究生求职信
2013/10/02 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL