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 $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
Jun 21 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
php 面试碰到过的问题 在此做下记录
Jun 09 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
dedecms函数分享之获取某一栏目所有子栏目
May 19 PHP
php获取四位字母和数字的随机数的实现方法
Jan 09 PHP
php去掉文件前几行的方法
Jul 29 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
php获取'/'传参的值简单方法
Jul 13 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 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遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
Python的argparse库使用详解
2018/10/09 Python
python 使用shutil复制图片的例子
2019/12/13 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
golang/python实现归并排序实例代码
2020/08/30 Python
用python对excel查重
2020/12/07 Python
比利时家具购买网站:Home24
2019/01/03 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
Java中实现多态的机制
2015/08/09 面试题
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
竞选演讲稿范文大全
2014/05/12 职场文书
小学课外活动总结
2014/07/09 职场文书
给客户的感谢信
2015/01/21 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
《植树问题》教学反思
2016/03/03 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
Python使用Web框架Flask开发项目
2022/06/01 Python