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中通过smtp发邮件的类,测试通过
Jan 22 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
详细解读PHP中接口的应用
Aug 12 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 PHP
PHP CURL与java http使用方法详解
Jan 26 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
Jul 17 PHP
Laravel框架搜索分页功能示例
Feb 01 PHP
PHP实现文字写入图片功能
Feb 18 PHP
PHP-FPM的配置与优化讲解
Mar 15 PHP
PHP控制循环操作的时间
Apr 01 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
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python yield与实现方法代码分析
2018/02/06 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
华为慧通面试题
2012/09/11 面试题
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
中学生班主任评语
2014/01/30 职场文书
网络管理专业求职信
2014/03/15 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
开网店计划分析
2019/07/30 职场文书
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏