php中spl_autoload详解


Posted in PHP onOctober 17, 2014

SPL有两个不同的函数 spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。

spl_autoload 是SPL实现的默认的自动加载函数,它的功能比较简单。它可以接收两个参数,第一个参数是$class_name,表示类名,第二个参 数$file_extensions是可选的,表示类文件的扩展名" title="扩展名">扩展名,可以在$file_extensions中指定多个扩展名" title="扩展名">扩展名,护展名之间用分号隔开即 可;如果不指定的话,它将使用默认的扩展名" title="扩展名">扩展名.inc或.php。spl_autoload首先将$class_name变为小写,然后在所有的 include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions参数的话),如果找 到,就加载该类文件。你可以手动使用spl_autoload(”Person”, “.class.php”)来加载Person类。实际上,它跟require/include差不多,不同的它可以指定多个扩展名" title="扩展名">扩展名。

怎 样让spl_autoload自动起作用呢,也就是将autoload_func指向spl_autoload?答案是使用 spl_autoload_register函数。在PHP脚本中第一次调用spl_autoload_register()时不使用任何参数,就可以将 autoload_func指向spl_autoload。

通过上面的说明我们知道,spl_autoload的功能比较简单,而且它是在SPL扩展中实现的,我们无法扩充它的功能。如果想实现自己的更灵活的自动加载机制怎么办呢?这时,spl_autoload_call函数闪亮登场了。

我 们先看一下spl_autoload_call的实现有何奇妙之处。在SPL模块内部,有一个全局变量autoload_functions,它本质上是 一个HashTable,不过我们可以将其简单的看作一个链表,链表中的每一个元素都是一个函数指针,指向一个具有自动加载类功能的函数。 spl_autoload_call本身的实现很简单,只是简单的按顺序执行这个链表中每个函数,在每个函数执行完成后都判断一次需要的类是否已经加载, 如果加载成功就直接返回,不再继续执行链表中的其它函数。如果这个链表中所有的函数都执行完成后类还没有加载,spl_autoload_call就直接 退出,并不向用户报告错误。因此,使用了autoload机制,并不能保证类就一定能正确的自动加载,关键还是要看你的自动加载函数如何实现。

在php5中的标准库方法spl_autoload相当于实现自己的__autoload

<?php

    function __autoload($classname){

        if(is_file($classname.'.php'){

            include $classname.'.php';

        } elseif(is_file($classname.'.inc'){

            include $classname.'.inc';

        }

    }

它会在注册目录下自动寻找与$classname同名的.php/.inc文件。当然,你也可以指定特定类型的文件,方法是注册扩展名

<?php

    spl_autoload_extensions('.php,.inc,.some');

这样,它也会搜索.some文件。默认,php是不会启动spl_autoload的,那么怎样才能自动让spl_autoload生效呢呢?方法是

<?php

    spl_autoload_register();

spl_autoload_register有一个$callback参数,如果不指定,它就会自动注册spl_autoload,为了能搜寻更多的自动加载目录,可以在这些代码前面设置自动加载目录

<?php

    set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);

这样,当php找不到指定的类时,就会在set_include_path指定的目录下寻找。

这些方法常用在php框架中。比如把上面的介绍串连起来:

<?php

set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);

spl_autoload_extensions('.php,.inc,.some');

spl_autoload_register();

当你要加载some/path下面的classA类时,它会在目录下寻找classa.php或classa.inc或classa.some,这样你就可以放心地运用new classA或extends classA

<?php

    ClassB extends ClassA {

        // code..

    }
    $a = new ClassA;

    $b = new ClassB;
PHP 相关文章推荐
新版mysql+apache+php Linux安装指南
Oct 09 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
Dec 02 PHP
php生成随机密码的三种方法小结
Sep 04 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
Mar 24 PHP
php设计模式 Command(命令模式)
Jun 26 PHP
php小技巧之过滤ascii控制字符
May 14 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
PHP实现批量修改文件后缀名的方法
Jul 30 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
Mar 30 PHP
Yii2处理密码加密及验证的方法
May 12 PHP
laravel 实现向公共模板中传值 (view composer)
Oct 22 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
Oct 17 #PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 #PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 #PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 #PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 #PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 #PHP
ThinkPHP分页实例
Oct 15 #PHP
You might like
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
jquery中获取元素的几种方式小结
2011/07/05 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
JavaScript实现简单的拖动效果
2016/07/02 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
express.js中间件说明详解
2019/03/19 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
python进阶教程之循环对象
2014/08/30 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
python实现抽奖小程序
2020/04/15 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
珍珠奶茶店创业计划书
2014/01/11 职场文书
一份文言文检讨书
2014/09/13 职场文书