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 相关文章推荐
php 常用类汇总 推荐收藏
May 13 PHP
PHP学习之数组的定义和填充
Apr 17 PHP
PHP新手入门学习方法
May 08 PHP
PHP Undefined index报错的修复方法
Jul 17 PHP
PHP stripos()函数及注意事项的分析
Jun 08 PHP
PHP之短标签开启设置
Jun 17 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
PHP中的数组处理函数实例总结
Jan 09 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 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
PHP教程 基本语法
2009/10/23 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php抽象类使用要点与注意事项分析
2015/02/09 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
js运动事件函数详解
2016/10/21 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
Python探索之URL Dispatcher实例详解
2017/10/28 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
python for 循环获取index索引的方法
2019/02/01 Python
没编程基础可以学python吗
2020/06/17 Python
Python list和str互转的实现示例
2020/11/16 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
办公室岗位职责
2014/02/12 职场文书
销售顾问岗位职责
2014/02/25 职场文书
广告宣传策划方案
2014/05/21 职场文书
关于教师节的广播稿
2014/09/10 职场文书
中学社团活动总结
2015/05/07 职场文书
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android