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 相关文章推荐
php 删除记录同时删除图片文件的实现代码
May 12 PHP
php学习笔记之 函数声明
Jun 09 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
Jul 12 PHP
解析Linux下Varnish缓存的配置优化
Jun 20 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
php中$_POST与php://input的区别实例分析
Jan 07 PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
PHP中list方法用法示例
Dec 01 PHP
Yii2实现UploadedFile上传文件示例
Feb 15 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 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
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
python实现每次处理一个字符的三种方法
2014/10/09 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
财务分析个人的自荐书范文
2013/11/24 职场文书
精彩的英文自荐信
2014/01/30 职场文书
德语专业求职信
2014/03/12 职场文书
企业宗旨标语
2014/06/10 职场文书
企业环保标语
2014/06/10 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
家长评语怎么写
2014/12/30 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书