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中Date获取时间不正确怎么办
Jun 05 PHP
PHP 开源AJAX框架14种
Aug 24 PHP
PHP 压缩文件夹的类代码
Nov 05 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 PHP
非常重要的php正则表达式详解
Jan 04 PHP
PHP中调用C/C++制作的动态链接库的教程
Mar 10 PHP
9个比较实用的php代码片段
Mar 15 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
Apr 12 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
PHP下载文件函数与用法示例
Sep 27 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&amp;mysql(五)
2006/10/09 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
python判断字符串以什么结尾的实例方法
2020/09/18 Python
如何利用Python 进行边缘检测
2020/10/14 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
教师演讲稿范文
2014/01/08 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
优秀党员申报材料
2014/12/18 职场文书
高一数学教学反思
2016/02/18 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
Java无向树分析 实现最小高度树
2022/04/09 Javascript
mysql sock 文件解析及作用讲解
2022/07/15 MySQL