spl_autoload_register — 注册给定的函数作为 __autoload 的实现

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

spl_autoload_register函数是实现自动加载未定义类功能的的重要方法,所谓的自动加载意思就是 我们的new 一个类的时候必须先include或者require的类文件,如果没有include或者require,则会报错。那这样我们就必须在文件头部写上许多include或require文件,非常麻烦,

为了使得没有include或者require类的时候也正常new一个类,所以有了自动加载的概念,也就是说new一个类之前不用事先包含类文件也可以正常new,这样我们的文件头部就不用包含许多include(require)。其实这算一种封装!

用spl_autoload_register函数可以实现上面说的功能,我们来看看实现原理。这个函数的参数如下:

autoload_function
这是一个函数【方法】名称,可以是字符串或者数组(调用类方法使用)。这个函数(方法)的功能就是,来把需要new 的类文件包含include(requeire)进来,这样new的时候就不会找不到文件了。其实就是封装整个项目的include和require功能。

throw
此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

prepend
如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

当我们new一个类,并且这个类文件没有被包含时候就会执行这个autoload_function方法:
先来看一个错误例子:

//当我们直接new一个未包含class类文件时候会报错
$objDemo = new AutoloadClass();
/**
Fatal error: Uncaught Error: Class 'AutoloadClass' not found in E:\work\demo\spl\autoloadDemo.php on line 3Error: Class 'AutoloadClass' not found in E:\work\demo\spl\autoloadDemo.php on line 3
*/

使用spl_autoload_register方法

//文件 autoloadClass.php ,需要new的文件
class AutoloadClass{public function __construct(){echo '你已经包含我了';}
}//文件autoloadDemo.php文件
spl_autoload_register('myAutoLoad', true, true);
function myAutoLoad($className){echo "所有的包含文件工作都交给我!\r\n";$classFileName = "./{$className}.php";echo "我来包含!{$classFileName}\r\n";include "./{$className}.php";
}
$objDemo = new AutoloadClass();
/**
输出:
所有的包含文件工作都交给我!
我来包含!./AutoloadClass.php
你已经包含我了
*/

通过上面例子我们可以看到,当new一个未包含的类时候,会去执行spl_autoload_register第一个参数函数名的函数,这个函数有一个参数就是需要new的类名,这个函数的功能就是把这个类给包含进来(类名和文件名一致),这样就实现了自动加载功能。原理就是这样,不是很复杂。
另外我们可以改为匿名函数来实现:

spl_autoload_register(function ($className)
{echo "所有的包含文件工作都交给我!\r\n";$classFileName = "./{$className}.php";echo "我来包含!{$classFileName}\r\n";include "./{$className}.php";
}, true, true);
$objDemo = new AutoloadClass();
/**
输出:
所有的包含文件工作都交给我!
我来包含!./AutoloadClass.php
你已经包含我了
*/

PHP自动加载(上)——spl_autoload_register相关推荐

  1. PHP自动加载上——spl_autoload_register

    spl_autoload_register函数是实现自动加载未定义类功能的的重要方法,所谓的自动加载意思就是 我们的new 一个类的时候必须先include或者require的类文件,如果没有incl ...

  2. PHP的自动加载__autoload spl_autoload_register

    https://www.jb51.net/article/134372.htm 问题 传统上,在PHP里,当我们要用到一个class文件的时候,我们都得在文档头部require或者include一下: ...

  3. php之自动加载(懒加载)

    有A类和B类,如果在A类实例化B类,最简单直接的方法就是在B中使用include require_once A的文件,但是这种方法显然是不友好的,在框架中叶不是这么做的,在框架中使用的是自动加载的机制 ...

  4. php自动加载机制的实现

    一.什么是自动加载 自动加载就是当我们在当前文件中实例化一个不存在的类时,调用自动加载机制引入相应的类文件. 注:自动加载有两种方式(都是php内置的),一种是通过__autoload(),另一种是通 ...

  5. Final关键字和类的自动加载

    Final关键字: 父类中的方法被声明为 final,则子类无法覆盖该方法.如果一个类被声明为 final,则不能被继承. 一般是为了防止父类的一个方法被重写.只能用来定义类和定义方法, 不能使用fi ...

  6. PHP自动加载类—__autoload()和spl_autoload_register()

    test.php <?php function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new ...

  7. php tp 重加载页面,thinkPHP线上自动加载异常与修复方法实例分析

    本文实例讲述了thinkPHP线上自动加载异常与修复方法.分享给大家供大家参考,具体如下: 项目遇到一个奇怪的问题,本地代码正常,服务器上却不正常. 经过测试,应该是自动加载出了问题,尝试了各种方法, ...

  8. php cli spl_autoload_register,PHP spl_autoload_register 自动加载方法浅析

    本节内容: PHP spl_autoload_register 自动加载 说明: spl_autoload_register()函数是主流框架使用最多的函数,也是非常核心的函数之一,可实现自动注册函数 ...

  9. spl_autoload_register 注册自己的自动加载函数(__autoload())

    说明: PHP实例化没有加载的类的,会自动调用__autoload();函数加载,可以通过__autolaod()函数来require类,解决很多类,多次require的问题, 可以通过spl的标准P ...

  10. ios 平滑移动view_iOS 关于列表上拉(平滑加载数据)自动加载数据的问题

    项目需求 我的的列表需要改变,原来的分页加载采用的是MJRefresh框架进行加载更多数据,这需要有一个上拉动作才能触发,而我的产品的意思是当快要滑动到底部时自动加载下一页数据.我自己看了一下,发现很 ...

最新文章

  1. unix查找的字符串包含特殊字符_python3从零学习-5.4.7、Unix风格路径名模式扩展glob...
  2. Android笔记之调用其他软件
  3. ABPHelper.CLI及其依赖项简单介绍
  4. game,match,competition,contest区别
  5. gsoap初始化释放_通过gsoap使用webservice
  6. Python线程同步机制
  7. vue 自定义指令_vue 自定义指令
  8. Netscreen ×××配置(一)---基于策略的点到点×××设置
  9. 移动端问题列表及解决方案
  10. Excel乱码的解决方法
  11. 世界坐标和本地坐标之间的转换
  12. 服务器物理硬盘序列号,服务器硬盘序列号查看
  13. linux下repo文件的配置
  14. android 锯齿
  15. trinity的简介、下载及使用
  16. ** ERROR (nifti_image_write_hdr_img2): cannot open output file
  17. woo如何监听目录和文件变动,woo目录中的文件被改变,监听文件被修改权限
  18. 树莓派人脸/ic卡识别门禁系统
  19. vscode安装python扩展并开展远程调试的过程
  20. Autodesk Inventor Professional 2022.0.1 Update Only x64

热门文章

  1. 循环队列和链队的表示和实现
  2. python访问字符串中的部分字符的操作_小白学Python-13(字符串基础与简单操作)...
  3. 浮点型变量的误差问题
  4. vivado路径最大时钟约束_Vivado时序收敛技术(二) 时序违例的根本原因及解决方法...
  5. 【UVa10674】Tangents(两圆公切线的切点--验板子题)
  6. 【POJ2796】Feel Good (简单单调栈)
  7. C语言向文件写入学生信息并读取显示出来
  8. Pyspark:电影推荐
  9. python删除过期文件_python 删除过期文件的方法+源码
  10. 搜狐校园“情感分析×推荐排序“算法大赛 AutoX方案 转载poteman