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 相关文章推荐
屏蔽浏览器缓存另类方法
Oct 09 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
php中url函数介绍及使用示例
Feb 13 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
php将access数据库转换到mysql数据库的方法
Dec 24 PHP
功能强大的php分页函数
Jul 20 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
PHP工厂模式简单实现方法示例
May 23 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 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 Curl多线程原理实例详解
2013/11/06 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
详解php实现页面静态化原理
2017/06/21 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
python中List的sort方法指南
2014/09/01 Python
Python实现备份文件实例
2014/09/16 Python
深入讲解Python中的迭代器和生成器
2015/10/26 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
会计自我鉴定
2013/11/02 职场文书
学习十八大精神心得体会
2013/12/31 职场文书
政风行风建设整改方案
2014/10/27 职场文书
地雷战观后感
2015/06/09 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python
Oracle使用别名的好处
2022/04/19 Oracle