在autoload机制引入前,要引用其他文件中的函数和类需使用include/require把文件加载。随着SPL库中的autoload机制以及命名空间的完善,现代化PHP开发鲜少见到以include/require的方式加载类。

使用require/include加载类的方式是直接的:包含类定义所在的文件,类的定义自然就有了。在规模稍大的项目中,这种方式会导致每个PHP文件开头都是一堆include/require。如果某些文件中定义了一些全局常量,会导致不时抛出重复定义的警告。如果使用第三方类库,还需要了解库的结构,以便正确的引入文件。可以看到,这种方式加载类是低效且乏味的。

PHP5引入了__autoload函数来简化类的加载工作。如果一个函数的定义不存在,该函数总是被调用。开发人员可通过这个函数实现类文件的加载,例如:

function __autoload($classname){ require_once("{$classname}.php")}

但是该函数不被建议使用,并在PHP7.2中被废弃。被废弃的原因是PHP不允许函数重名,所以一个项目中仅能出现一个__autoload函数。自己写的代码保证只有一个__autoload函数虽然有点难但也能做到,要是第三方库也定义了__autoload,那就很头疼了。__autoload的后继者是spl_autoload_register函数,这才是PHP解决类自动加载的利器。

spl_auoload_register函数的参数是一个回调函数,调用该函数会将注册的加载函数放入autoload函数队列中。无法找到类的定义时,Zend引擎会顺序回调队列中的函数,直到类定义找到或者抛出类未定义的异常。使用spl_autoload_register,有几个值得注意的点:

理论上可以注册无限个加载函数,相比之下__autoload只能被定义一次;

PHP引擎会顺序调用注册的函数。从效率考虑,最常用类的加载函数应该放在队列的头部;

spl_autoload_register注册的函数,是PHP给开发人员最后的机会协助找到类,否则直接抛异常。new, static调用,class_exists的操作,都可能会触发调用注册的加载函数;

spl_autoload_register常和PSR-4规范搭配使用,实现方式高效且优雅。

有了spl_autoload_register,程序中再也不用一堆include/require,取而代之的是使用use。可能有人觉得使用一堆use没见得比使用一堆require/include方便。实际上,use的好处有以下几点:

同一个名字空间下的类,不需要通过use导入;

PHP7中可以以组的方式引入类,例如use app\utils{A, B, C},省行数又方便;

use可以为类设置别名,避免同类名引发的错误;

使用use,无需考虑绝对路径、相对路径等问题,都交给注册的加载函数处理。

有了spl_autoload_register,让PHP的面向对象编程更为完善和优雅,也让PHP以更现代化的方式运行。

除了spl_autoload_register,spl_autoload系列函数还有spl_autoload_call/spl_autoload_extentions/spl_autoload_functions/spl_autoload_unregister。这几个函数一般程序开发中很少用到,开发类库时可能会使用的上。

php自动加载什么时候用到,php的自动加载的使用相关推荐

  1. vue 使用video加载视频进行展示,视频循环自动播放

    vue 使用video加载视频进行展示,视频循环自动播放loop autoplay <span v-else-if="item.prop === 'alarmVedio'"& ...

  2. nuScenes自动驾驶数据集:格式转换,模型的数据加载(二)

    文章目录 一.nuScenes数据集格式精解 二.nuScenes数据格式转换(To COCO) 数据格式转换框架 2.1 核心:convert_nuScenes.py解析 其他格式转换文件 2.1. ...

  3. 微信 html自动加载js,微信小程序实现图片预加载组件

    网页中的图片预加载 图片预加载对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.我们知道在 Web 页面中实现图片的预加载 ...

  4. java模块化按需加载,JavaScript模块化之使用requireJS按需加载

    模块加载器的概念可能稍微接触过前端开发的童鞋都不会陌生,通过模块加载器可以有效的解决这些问题: JS文件的依赖关系. 通过异步加载优化script标签引起的阻塞问题 可以简单的以文件为单位将功能模块化 ...

  5. MTK平台Metadata的加载(3)——其他Static和Request加载

    (1)加载其他Static Metadata 在 MetadataProvider.cpp 中的 constructStaticMetadata()进行 static metadata 加载. (A) ...

  6. ie加载项存在残留是什么_ie删除加载项,包括一项和多项两种情况

    当安装某个软件(如下载或聊天软件)后,如果它有 ie 的加载项,则自动添加到 ie,然后在 ie 的管理加载项窗口,我们既可以启用又可以禁用,但不能删除.因为 ie 的加载项不是独立存在的,它只是软件 ...

  7. python 异步加载_Python学习笔记4——爬取异步加载数据

    一.什么是异步加载? 在之前的学习笔记中,爬取的网页是需要手动翻页的网址,但是一些网站是通过自动加载翻页的,如knewone网页.浏览knewone的官网就能发现,当下拉到网页最下端时,网站会自动加载 ...

  8. Bigemap加载CAD(dxf)、SHP、KML数据加载并套合到卫星图像上

    Bigemap加载CAD(dxf).SHP.KML数据加载并套合到卫星图像上 同步视频教程:如何编辑已有的测绘数据(excel转KML,txt转KML)-Bigemap GIS Office 视频教程 ...

  9. ajax下拉 加载 下一页,jQuery滑动到底部加载下一页数据的实例代码

    page_num =page_num+1 ; //页码自动增加,保证下次调用时为新的一页. $.ajax({ type: "get", url: rent_url, data: ' ...

  10. android调用h5预加载图片,使用HTML5的页面资源预加载(Link prefetch)功能加速你的页面加载速度...

    不管是浏览器的开发者还是普通web应用的开发者,他们都在做一个共同的努力:让Web浏览有更快的速度感觉.有很多已知的技术都可以让你的网站速度变得更快:使用CSS sprites,使用图片优化工具,使用 ...

最新文章

  1. android8显示广播,关于android8.0静态接收广播
  2. 怎么获取web项目的webroot根目录下面的文件夹的路径?
  3. neo-6m uno_Uno-统治所有人的平台
  4. 计算机自爆命令,《我的世界》僵尸自爆指令一览 简单实用!
  5. SQL62 出现三次以上相同积分的情况
  6. 聊聊flink JobManager的heap大小设置 1
  7. 题解(5-8)-----寒假练习赛(一)
  8. 解决Nvidia显卡控制面板闪退问题
  9. 谷歌人工智能深度解剖:从HAL的太空漫游到AlphaGo,AI的春天来了
  10. 全球最专业的技术媒体,如何复盘 2019 AI 的发展?
  11. 广州王师傅揭秘未来20年最有前途的行业!——不要再错过下一个风口
  12. DBA与项目的那堆事 ——目录
  13. 手写:下划线转为驼峰命名法
  14. 自助式拍照打卡签到活动,亚运地点拍照打卡活动,<h2>JavaScript ISO
  15. 数字信号分析学习思想整理 | 基本框架
  16. 软通动力入职考试----全套
  17. 用墨刀做出的交互动效,10个优秀作品欣赏
  18. 秉火429笔记之四启动文件分析
  19. 存储器Flash页、扇区、块的区别
  20. 计算机二级小蒋是一位中学老师,计算机二级excel所有公式样稿.docx

热门文章

  1. 不到 100 行 Python 代码徐峥变葛优
  2. 一日一技:安装Python第三方库的几种姿势
  3. Python高级——Web静态服务器(面向对象)
  4. 源码分析参考:Connection
  5. 学位论文检测系统的说明与修改
  6. 有自定义控件的网站项目发布时,“不允许循环文件引用”的错误”的解决方法
  7. 漫步数学分析番外五(上)
  8. [深度学习-数据集] cifar-10数据集介绍
  9. TensorFlow 中 identity 函数理解
  10. JDK和JRE的区别、下载并安装JDK