php中spl_autoload详解
这篇文章主要讲解的是php中spl_autoload详解,文章内容非常详细,相信一定可以解决你的问题,需要的朋友可以参考下哦
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中__destruct与register_shutdown_function执行的先后顺序问题
本文标题:php中spl_autoload详解
本文地址:https://www.tabangni.com/phpstudy/6930.html
查看更多与“PHPspl autoload”有关的文章
- 01-17PHP中基本符号及使用方法
- 01-14PHP count_chars()函数讲解
- 01-17PHP hex2bin()函数用法讲解
- 01-16PHP implode()函数用法讲解
- 01-15PHP lcfirst()函数定义与用法
- 01-15PHP join()函数用法与实例讲解
- 01-14PHP中quotemeta()函数的用法讲解
- 01-18PHP中number_format()函数的用法讲解
- 01-18PHP中str_split()函数的用法讲解
- 01-17一个正则的写法 php
- 01-16php 正则表达式学习笔记
- 01-17php下常用表单验证的正则表达式
- 01-15PHP 正则表达式分析RSS
- 01-16PHP 正则表达式验证中文的问题
- 01-18php中utf-8编码下用正则表达式如何匹配汉字
- 01-16PHP正则匹配图片并给图片加链接详解
- 01-17PHP 正则表达式的几则使用技巧
- 01-18PHP 正则表达式常用函数使用小结
- 01-18php 正则 不包含某字符串的正则表达式
- 01-18PHP 正则 email语句详解
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
推荐阅读
最近更新
- 01-19php中spl_autoload详解
- 01-19php实现TCP端口检测的方法
- 01-19站长讲解JSON.stringify转换JSON时日期时间不准确的解决方法
- 01-19高级技术员叙述javascript中的五种基本数据类型
- 01-19图文介绍javascript中String类的subString()方法和slice()方法
- 01-19站长传授非html5实现js版弹球游戏示例代码
- 01-19中级技术员研习详解JavaScript逻辑Not运算符
- 01-19ASP.NET微信开发(接口指南)
- 01-19高手讲说基于js原生和ajax的get和post方法以及jsonp的原生写法实例
- 01-19php根据用户名和手机号查询是否存在手机号码
