1. __autoload

这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:

./myClass.php
<?php
class myClass {
public function __construct() {
echo "myClass init'ed successfuly!!!";
}
}
?>
./index.php
<?php
// we've writen this code where we need
function __autoload($classname) {
$filename = "./". $classname .".php";
include_once($filename);
}
// we've called a class ***
$obj = new myClass();
?>

从上面能看到这是两个文件,下面的index.php 中,new了个 myClass类,但是明显本文件不存在,现在就会自动调用 __autoload函数,并 把 “myClass”这个类名字符串 直接作为参数传给__autoload, 此时自动加载函数内部就可以引入该文件了,引入后就正常初始化该类了。 该函数在PHP 7.2.0后被废弃了。

2. spl_autoload_register

spl_autoload_register 可以将 函数自动注册,也就是说,当PHP文件内访问了一个不存在的类时,会自动去调用该函数,然后执行该函数内部的函数,看起来和 autoload的作用是一样的。但是其实spl_autoload_register 这个函数功能更强大, autoload的参数 仅仅是一个函数名,这是定死的。并且只能声明一次, 使用了autoload后,就不能再次使用该函数了。

请注意:一个项目中只能有一个__autoload, 如果在PHP在执行过程中遇到两个__autoload会直接报错的。

很明显,autoload无法满足要求, 所以就有了SPL扩展,spl_autoload_register接受函数名或闭包,或数组作为参数,在闭包内部,即可引入对应的文件了。并且spl_autoload_register可以注册一个 自动加载队列,先注册的,先调用。

参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。
throw
此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。
prepend
如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

可以结合require_once一起使用。如:

function_1(){
$clsName = str_replace("\\",DIRECTORY_SEPARATOR, $class_name);
if (is_file(__DIR__.DIRECTORY_SEPARATOR."src".DIRECTORY_SEPARATOR.$clsName . '.php')) {
//文件内部有类名 为 TestClass_1的类
require_once(__DIR__.DIRECTORY_SEPARATOR."src".DIRECTORY_SEPARATOR.$clsName.'.php');
}
}
function_2(){
$clsName = str_replace("\\",DIRECTORY_SEPARATOR, $class_name);
if (is_file(__DIR__.DIRECTORY_SEPARATOR."Module".DIRECTORY_SEPARATOR.$clsName . '.php')) {
//文件内部有类名为TestClass_2的类
require_once(__DIR__.DIRECTORY_SEPARATOR."Module".DIRECTORY_SEPARATOR.$clsName.'.php');
}
}
spl_autoload_register('function_1');
spl_autoload_register('function_2');
$obj = new TestClass_2(); //当前没有TestClass_2这个类,于是自动调用function_1, 引入了文件,但是引入的文件中仍然没有TestClass_2这个类,于是又自动调用function_2, 引入了文件,此时正常初始化

3.相关的其他SPL函数

3.1 spl_autoload_call

该函数是需要用户显示调用所有已注册的 autoload函数的。 作用在 spl_autoload_register之后。 传入函数名字即可。即可手动引入文件了。

3.2 spl_autoload_functions

可以获取到所有已经注册的autoload函数, 也是作用在 spl_autoload_register之后的。

3.3 spl_autoload_extensions

注册并返回spl_autoload函数使用的默认文件扩展名, 但是此接口和spl_autoload函数,用处不大。spl_autoload 是autoload的默认实现,意思就是spl_autoload对autoload进行了又一次封装,在默认情况下,本函数先将类名转换成小写,再在小写的类名后加上 .inc 或 .php 的扩展名作为文件名,然后在所有的包含路径(include paths)中检查是否存在该文件。

__autoload 函数是用来处理自动加载的函数,在 PHP 找不到指定类时就会去调用自动加载类,加载所需要的类。

__autoload 只是一个抽象定义,实现(实现就是定义如何加载,加载的规则是什么,加载的文件是什么等等)是交给用户的,而 spl_autoload 则是 SPL 所定义的 autoload 一种实现。spl_autoload 函数所实现的加载规则就是去 include paths 中查找对于的类。spl_autoload 遵循是是 psr-0 的载入规则,而 include paths 就是载入时被查询的路径。

其他自己实现的 autoload 类都可以通过 spl_autoload_register 进行注册,注册之后就可以在需要类时自动调用被注册的方法进行加载了。 spl_autoload 也是 autoload 的一种实现,按理也是需要注册的,只不过因为是内部的默认实现,所有已经自动注册在 PHP 里了。

spl_autoload 如今来看并没有太多用处,应该是因为历史问题残留在 PHP 中的,目前绝大多数程序都没有使用 spl_autoload 去做自动加载,因为它的规则已经定死,并不适合衍生一些功能。

因为 PHP 只有一个自动加载方法,所以 SPL 的 spl_autoload 和 spl_autoload_register 要争抢这个方法,所以在 SPL 的 C 实现中,用了好多折衷的办法。在没有使用 spl_autoload_register 注册任何自定的自动加载函数时, PHP 的自动加载方法是挂在 spl_autoload 下的,而 spl_autoload_register 注册了自动加载函数后,PHP 的自动加载方法是挂在 spl_autoload_call 这个方法下的,而 spl_autoload 也会成为一个备选项进入 spl_autoload_register 的自动加载队列。

PHP SPL扩展库简单使用的更多相关文章

  1. PHP的SPL扩展库(一)数据结构

    SPL 库也叫做 PHP 标准库,主要就是用于解决典型问题的一组接口或类的集合.这些典型问题包括什么呢?比如我们今天要讲的数据结构,还有一些设计模式的实现,就像我们之前讲过的观察者模式相关的接口在 S ...

  2. ThinkPHP5微信支付扩展库(超级简单, 超级超好用!)

    ThinkPHP5微信支付最新扩展库(2017年9月24日). 我的想法很简单,就是只需要调用一个静态方法就可以完成支付,查询,退款,查账等等, 无需重复造轮子, 专注自己业务!欢迎到Github查看 ...

  3. ThinkPHP5 支付宝支付扩展库(超级简单,超级好用!)

    ThinkPHP5 支付宝支付扩展库, 一个静态方法的调用就可以实现,包括手机网站支付.电脑网站支付.支付查询.退款.退款查询.对账单所有功能,而且是2017年7月20日最新版~我的想法是,调用一个静 ...

  4. Z.ExtensionMethods 一个强大的开源扩展库

    今天有意的在博客园里面搜索了一下 Z.ExtensionMethods 这个扩展类库,确发现只搜到跟这个真正相关的才两篇博文而已,我都点进去看了一下,也都只是提到而已,没有专门介绍,才引起我写这篇文档 ...

  5. window下python 扩展库安装 使用第三方镜像源

    0.前言     由于python的官方镜像位于国外,若使用pip或者easy_install安装第三方插件时或许会被限制,甚至连easy_install或pip也无法安装,例如在windows环境下 ...

  6. php笔记08:数据库编程---使用php的MySQL扩展库操作MySQL数据库

    1.使用php的MySQL扩展库操作MySQL数据库: php有3种方式操作MySQL数据库 (1)mysql扩展库 (2)mysqli扩展库 (3)pdo     mysql扩展库与mysql数据库 ...

  7. php使用mysql扩展库链接mysql数据库(查询)

    php链接数据库可以使用mysql扩展库,mysqli,pdo这几种方式,相比java而言要麻烦一点,因为它不像java那么统一.从代码的难易程度来说php的确要简单许多.步骤大体如下 1.打开数据库 ...

  8. linux服务器安装php GD扩展库方法

    Strict Standards: Only variables should be assigned by reference in/home/wienholl/public_html/includ ...

  9. php下安装动态扩展库的相关事项

    php下安装动态扩展库的相关事项 我下载的Apache版本为2.4,PHP版本为7.0. 将Apache与PHP集成配置好后(PHP安装目录为:G:\computer\web\php7,apache安 ...

随机推荐

  1. CodeForces 86 D Powerful array 莫队

    Powerful array 题意:求区间[l, r] 内的数的出现次数的平方 * 该数字. 题解:莫队离线操作, 然后加减位置的时候直接修改答案就好了. 这个题目中发现了一个很神奇的事情,本来数组开 ...

  2. to_char()、to_date()的区别

    to_char 是把日期或数字转换为字符串 to_date 是把字符串转换为数据库中得日期类型 还记得以前初次接触oracle时对一些函数还不是很熟悉,老是弄错,比如在mysql中可以运行,但在ora ...

  3. Linux入门基础之一

    Linux 入门基础 一.Linux 系统安装 安装方法网上很多,请自行百度 二.Linux 基本操作 2.1.GNOME图形界面基本操作 操作类似于Windows系统操作 打开每一个文件夹都会打开一 ...

  4. 4.cache每个参数的意义和作用以及工作原理?

    在程序开发过程中,适当使用 Cache 缓存能有效提高程序执行效率.比如一些常常调用的系统公共变量,把它们缓存到 Cache 中,当需要使用它们时,直接从 Cache 中读取,不必每次都从数据库或文件 ...

  5. charles 界面

    本文参考:charles 界面 没有用过,先留个记号,以后再来看 profiles contain a complete copy of all your configuration settings ...

  6. 41 (OC)* OC的理解与动态特性

    1:动态类型(Dynamic typing),动态绑定(Dynamic binding)和动态加载(Dynamic loading). 动态类型:即运行时再决定对象的类型.简单说就是id类型.id类型 ...

  7. 13 (OC)* SDWebImage

    IOS SDWebImage实现原理详解   在之前我写过SDWebImage的使用方法,主要是用与获取网络图片,没有看过的朋友可以看看. 这篇文章将主要介绍SDWebImage的实现原理,主要针对于 ...

  8. 百度脑图-离线版(支持Linux、Mac、Win)

    免费好用的思维导图软件(在线版) 离线版:桌面版脑图是基于百度脑图的本地化版本,帮助你在没有互联网环境的情况下,依然可以使用脑图工具. 百度脑图帮助你进行思维导图,可以运用于学习.写作.沟通.演讲.管 ...

  9. Python3.7.4入门-3函数

    3 函数 3.1 定义函数 def fib(n): # write Fibonacci series up to n """Print a Fibonacci serie ...

  10. .Net Core 添加 Swagger 支持

    1. NuGet  中添加 Swashbuckle.AspNetCore 2.添加 Startup 信息 将 Swagger 生成器添加到 Startup.ConfigureServices 方法中的 ...