php自动加载机制的深入分析


Posted in PHP onJune 08, 2013

一、php中实现自动加载的方法
1.使用require,include,require_once,include_once手工进行加载。
2.使用__autoload来进行自动加载
3.使用spl的autoload来实现自动加载
手工加载的实现:

当需要加载的文件很少的时候我们可以使用第一个来完成。这样做很简单也没问题。

require_once 'a.php';
require_once 'b.php';
require_once 'c.php';

但是当需要加载文件很多的时候这样做还行吗?需要写十个,二十个require_once 或者更多的时候我们该怎么办?

这个时候我们可以使用__autoload方法来简化我们的代码。

__autoload加载的实现:
我们在test目录下创建一个in.php文件,内容如下。

echo '我是test下面的in.php<br />';

然后在test目录下创建一个loader.php,内容如下。
// 需要重载__autoload方法,自定义包含类文件的路径  
function __autoload($classname)  
{  
 $class_file = strtolower($classname).".php";  
 if (file_exists($class_file)){  
  require_once($class_file);  
 }  
}
@$test = new in(); // 执行到这里会输出 <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">我是test下面的in.php</SPAN>

没问题,成功了!我们还可以创建其他的文件来进行加载,但是当需要的文件很多需要区分目录的时候怎么办?

这时我们需要修改loader.php可以使用映射来找到要加载的文件。

function __autoload($class_name) {
 $map = array(
  'index' => './include/index.php',
  'in' => './in.php'
 );
    if (file_exists($map[$class_name]) && isset($map[$class_name])) {
        require_once $map[$class_name];
    }
}
new index();

这种方法的好处就是类名和文件路径只是用一个映射来维护,所以当文件结构改变的时候,不需要修改类名,只需要将映射中对应的项修改就好了。

但是__autoload在一个项目中只能使用一次,当你的项目引用了别人的一个项目,你的项目中有一个__autoload,别人的项目也有一个__autoload,这样两个__autoload就冲突了.解决的办法就是修改__autoload成为一个,这无疑是非常繁琐的,应用场景单一。

spl的autoload加载实现:
spl的autoload系列函数使用一个autoload调用堆栈,你可以使用spl_autoload_register注册多个自定义的autoload函数,应用场景广泛

php自动加载机制的深入分析

•在test目录下建立in.php,内容如下  

<?php
class in {
 public function index() {
  echo '我是test下面的in.php';
 }
}
?>

在test目录下建立loader.php,内容如下
<?php
set_include_path("/var/www/test/"); //这里需要将路径放入include
spl_autoload("in"); //寻找/var/www/test/in.php
$in = new in();
$in->index();

•spl_autoload_register将函数注册到SPL __autoload函数栈中,修改loader.php
function AutoLoad($class){
    if($class == 'in'){
        require_once("/var/www/test/in.php");
    }
}
spl_autoload_register('AutoLoad');
$a = new in();
$a->index();

•spl_autoload_register注册多个自定义的autoload函数的应用
首先在test目录下建立mods文件夹并建立inmod.mod.php内容如下:
<?php
class inmod
{
 function __construct()
 {
  echo '我是mods下的in';
 }
}

然后在test目录下建立libs文件夹并建立inlib.lib.php内容如下:
<?php
class inlib
{
 function __construct()
 {
  echo '我是libs下的in';
 }
}

最后在test目录下建立loader.php内容如下
<?php
class Loader {
    /**
    * 自动加载类
    * @param $class 类名
    */
    public static function mods($class) {
        if($class){
   set_include_path( "/var/www/test/mods/" );
   spl_autoload_extensions( ".mod.php" );
   spl_autoload( strtolower($class) );
        }
    }
    public static function libs($class) {
  if($class){
   set_include_path( "/var/www/test/libs/" );
   spl_autoload_extensions( ".lib.php" );
   spl_autoload( strtolower($class) );
        }
    }
}
spl_autoload_register(array('Loader', 'mods'));
spl_autoload_register(array('Loader', 'libs'));
new inmod();//输出<SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14px">我是mods下的in</SPAN>
new inlib();//<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">输出</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14px">我是libs下的in</SPAN>

PHP 相关文章推荐
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
php递归方法实现无限分类实例代码
Feb 28 PHP
smarty模板引擎从php中获取数据的方法
Jan 22 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
PHP常用的小程序代码段
Nov 14 PHP
使用PHP实现微信摇一摇周边红包
Jan 04 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
PHP函数按引用传递参数及函数可选参数用法示例
Jun 04 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
May 06 PHP
PHP常用正则表达式精选(推荐)
May 28 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 PHP
深入理解curl类,可用于模拟get,post和curl下载
Jun 08 #PHP
coreseek 搜索英文的问题详解
Jun 08 #PHP
探讨如何在php168_cms中提取验证码
Jun 08 #PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 #PHP
基于php常用正则表达式的整理汇总
Jun 08 #PHP
PHP计数器的实现代码
Jun 08 #PHP
使用cookie实现统计访问者登陆次数
Jun 08 #PHP
You might like
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
JavaScript数据结构与算法之链表
2016/01/29 Javascript
jQuery插件pagination实现无刷新分页
2016/05/21 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
webpack3+React 的配置全解
2017/08/21 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
高效使用Python字典的清单
2018/04/04 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
python3安装speech语音模块的方法
2018/12/24 Python
Django REST framework视图的用法
2019/01/16 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
电话客服专员岗位职责
2014/06/28 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
119消防日活动总结
2014/08/29 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
张丽莉观后感
2015/06/16 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
redis 查看所有的key方式
2021/05/07 Redis