1. __autoload

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

./myClass.php

class myClass {

public function __construct() {

echo "myClass init'ed successfuly!!!";

}

}

?>

./index.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 扩展,PHP SPL扩展库简单使用相关推荐

  1. php 动态加载扩展,仿照PHP的实现简单的扩展动态加载

    PHP通过扩展机制,可以方便的实现对PHP的动态扩展,在PHP扩展加载过程中简单的分析了PHP扩展的加载过程,下面可以继续根据PHP的相关实现,实现一个自己的简单的支持扩展的程序. 在PHP中,有个非 ...

  2. PHP - 各种扩展「底层扩展,上层扩展,自带扩展」

    1.应用场景 了解PHP扩展, 学以致用, 帮助理解PHP语言的本质, 以及如何开发出更加高效程序. 2.学习/操作 1. 文档 PHP: 按归属分 - Manual 怎么样"抄" ...

  3. ubuntu所有php扩展php-7.0扩展列表

    ubuntu所有php扩展php-7.0扩展列表 sudo apt-get install php7.0-bcmath sudo apt-get install php7.0-bz2 sudo apt ...

  4. 字扩展,位扩展,和字位扩展_6个有用的LibreOffice扩展

    字扩展,位扩展,和字位扩展 LibreOffice是周围最好的免费办公套件,因此,所有主要的Linux发行版都采用了LibreOffice. 尽管LibreOffice已经包含了功能,但是可以使用称为 ...

  5. Android扩展类方法,Android 扩展 uni小程序SDK 原生能力

    Android 扩展 uni小程序SDK 原生能力 概述 本文档主要介绍如何扩展 uni小程序SDK 原生能力. 什么是扩展原生能力? 扩展原生能力指的是将您原生开发的功能通过一定规范暴露给 uni小 ...

  6. 高并发(水平扩展,垂直扩展)

    转自:https://www.jianshu.com/p/be66a52d2b9b 一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是 ...

  7. 数据库水平扩展和垂直扩展

    原地址:https://www.cnblogs.com/blfshiye/p/5059748.html https://www.2cto.com/database/201607/524821.html ...

  8. 【Google Play】APK 扩展包 ( 2021年09月02日最新处理方案 | 扩展文件名格式 | 扩展文件下载存放地址 )

    文章目录 前言 一.当前 Google Play 上传 APK 文件现状 二.APK 扩展文件名格式 三.APK 扩展文件下载地址 四.博客资源 前言 2021年08月01日 之后 , Google ...

  9. IPv6扩展头部 (一) 扩展头部格式、类型与扩展选项

    之前几篇博客介绍了IPv6的扩展头部,包括分片头部和路由头部.接下来介绍一下IPv6扩展头部以及扩展选项的内容,可能会有这样的疑问,有了扩展头部怎么还需要扩展选项?扩展选项是干嘛用的?本篇博客就介绍相 ...

  10. 编译安装 PHP 扩展 - 含 swoole 扩展安装和升级

    编译安装 Redis 扩展 - phpredis 编译安装 Swoole 扩展 编译安装 Pcntl 扩展 编译安装 Sockets 扩展 编译安装 Event 扩展 编译安装 Mongodb 扩展 ...

最新文章

  1. Hadoop运行模式 之 伪分布式运行模式
  2. CTFshow 反序列化 web275
  3. [转]轻松掌握Ajax.net系列教程十五:使用AutoCompleteExtender
  4. 【小白学PyTorch】7.最新版本torchvision.transforms常用API翻译与讲解
  5. JavaScript判断浏览器 Browser detect
  6. oracle 常见错误
  7. python unittest 框架添加测试用例及运行
  8. python基础代码大全-Python基础汇总
  9. SparkStreaming安全消费Kafka数据
  10. Bevy 游戏引擎开发指南
  11. FIT2CLOUD飞致云发布MeterSphere开源持续测试平台
  12. 微软 Access数据库操作 中文教程
  13. USB协议详解第29讲(USB设备状态及数据交互条件)
  14. Python 用10行代码教你画出太阳花
  15. proc 文件的创建和读写
  16. 蚁群算法C语言最短路径规划,蚁群算法规划路径
  17. Python绘制节点是饼状图的社交网络图(Plot network with pie chart)
  18. 高斯模糊处理头像作为背景图的两种高效便捷方法
  19. win10安装PS和AI后报代码为16的错误解决方法
  20. java怎么强制回收某个对象_4、如何强制垃圾回收一个对象?(java)

热门文章

  1. “不问因由”就是爱上【防静电EVA泡棉】
  2. 猿创征文|java循环结构
  3. PMBOK项目管理知识体系指南第七版管理模型介绍系列
  4. 比特,位,字节,字的概念与区别
  5. mysql的CURDATE() + 1,月底最后一天不生效的问题,踩坑中!
  6. php csv乱码问题,如何解决php csv乱码问题
  7. Linux C TCPSocket 传输文件简单实例-多线程实现
  8. 【记录27】vant UI 登录+注册
  9. 爬取《乘风破浪的姐姐》的选手图片信息
  10. d3中图表大小自适应区域大小