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 相关文章推荐
生成缩略图
Oct 09 PHP
用PHP连接MySQL代码的参数说明
Jun 07 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
eAccelerator的安装与使用详解
Jun 13 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
Dec 17 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
Laravel框架实现redis集群的方法分析
Sep 14 PHP
php面试实现反射注入的详细方法
Sep 30 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
杏林同学录(五)
2006/10/09 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
PHP数组操作类实例
2015/07/11 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
PHP学习记录之数组函数
2018/06/01 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
2013/08/26 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
如何编写jquery插件
2017/03/29 jQuery
JS中图片压缩的方法小结
2017/11/14 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
Python执行时间的计算方法小结
2017/03/17 Python
Python扩展内置类型详解
2018/03/26 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
python的数学算法函数及公式用法
2020/11/18 Python
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
存储过程和sql语句的优缺点
2014/07/02 面试题
中文专业学生自我评价范文
2014/02/06 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android