在之前,我们已经学习过Composer自动加载的原理,其实就是利用了PHP中的类自动加载的特性。在文末有该系列文章的链接。

PHP中类的自动加载主要依靠的是__autoload()和spl_autoload_register()这两个方法。今天我们就来简单的看一下这两个方法的使用。

__autoload()

做为一个已经快要被淘汰的魔术方法,我们只需要了解即可。如果在PHP7中使用这个方法的话,会报出过时的警告,系统会建议我们使用spl_autoload_register()方法。

function __autoload($name){
include __DIR__ . '/autoload/' . $name . '.class.php';
} $autoA = new AutoA();
var_dump($autoA);

当我们实例化AutoA类时,当前的文件并没有这个类,也没有从其他文件中include或者require,这时,就会自动进入魔术方法__autoload()中。我们在__autoload()方法中只需要去include这个类所在的文件即可。

spl_autoload_register()

这个方法目前已经替代了上述魔术方法自动加载类的功能。它是spl扩展库中的一个方法,spl扩展库现在已经默认集成在了PHP中,大家可以放心地直接使用。

spl_autoload_register()相对于__autoload()的好处是它可以去注册一个__autoload(),并且实现并维护了一个__autoload()队列。原来在一个文件中只能有一个__autoload()方法,但现在,你拥有的是一个队列。

这样,你就不需要将所有加载代码都写在一个__autoload()方法中,而是可以使用多个spl_autoload_register()去单独进行每个类的加载处理。

spl_autoload_register(function($name){
include __DIR__ . '/autoload/' . $name . '.class.php';
}); $autoA = new AutoA();
var_dump($autoA);

参考:深入学习Composer原理(二)

使用include还是include_once

在自动加载中,我们只需要使用include就可以了,类并不会重复加载。

spl_autoload_register(function($name){
include __DIR__ . '/autoload/' . $name . '.class.php';
echo $name, PHP_EOL;
}); $autoA = new AutoA();
var_dump($autoA); $autoA = new AutoA();
var_dump($autoA); $autoA = new AutoA();
var_dump($autoA); $autoB = new AutoB();
var_dump($autoB);

从代码中,我们可以看出$name在多次实例化类的情况下只被输出了一次。所以并不需要关心会有类文件重复加载的问题。而且在大型框架中使用composer的时候会加载非常多的类,_once方法也会带来效率的问题。

总结

这次的文章只是对类自动加载进行了简单的介绍,想深入了解这方面知识的可以移步之前写过的Composer系列文章:

测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E4%B8%AD%E7%B1%BB%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD.php

参考文档:

https://www.php.net/manual/zh/language.oop5.autoload.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

PHP中类的自动加载的更多相关文章

  1. Composer实现PHP中类的自动加载

    本篇博客承接上一篇,学习一下Composer实现的PHP的类的自动加载方式.首先说明一下,Composer是PHP针对PHP语言的第三方的依赖管理工具,将工程所用到的依赖文件包含在composer.j ...

  2. 🐯 php项目中类的自动加载

    主要函数:spl_autoload_register() — 注册给定的函数作为 __autoload() 的实现 将函数注册到SPL __autoload函数队列中.如果该队列中的函数尚未激活,则激 ...

  3. PHP中类自动加载的方式

    最近在学习composer,发现从接触PHP到现在已经遇到了三种关于PHP中类的自动加载方式,这其中包括PHP自带的类的自动加载方式.PHP的第三方的依赖管理工具composer的加载方式以及PHP的 ...

  4. Yaf框架下类的自动加载

    前面两篇博客分别讲述了PHP自带的类加载和composer中类的自动加载,其实Yaf框架也实现了基于PSR0和PSR4的类的自动加载.根据我对Yaf下类的自动加载方式的理解写下这篇博客.由于接触Yaf ...

  5. Yaf零基础学习总结5-Yaf类的自动加载

    Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的 ...

  6. 浅析PHP类的自动加载和命名空间

    php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...

  7. BPM配置故事之案例3-参与者与数据自动加载

    这才过了两天,阿海又来了. 阿海:公司决定改进管理方式,以后物资申请的申请人和申请部门要写具体使用人的名字和部门了. 小明:不是要让我改回去吧? 阿海:那太麻烦了,你能不能把申请人改成选择,选好人自动 ...

  8. Composer概述及其自动加载探秘

    composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具 ...

  9. 让Lua自己把文件夹下面的所有文件自动加载起来吧

    没有想到我也做了一回标题党.其实这里边说的自动还是有夸大其词的部分.其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已. 怎么来进行Lua文件的加载 一般情况下,相关的功能需要给他创建 ...

随机推荐

  1. Dired Mode in Emacs

    Start up Dired mode: C-x d; (List dirs: C-x C-d) Hide Dired mode window: q; Mark Mark (for group man ...

  2. C++ 基于STL的演讲比赛流程管理系统(sort算法+小型算法(accumulate)+内建函数对象+string字符串拼接+字符串截取+多个容器基础操作+与用户交互+文件的读写+保存+重建+整体文件数据的清空)

    1 /* 2 比赛规则: 3 学校举行一演讲比赛,共12个人参加,比赛两轮,第一轮为淘汰赛 第二轮为决赛 4 每名选手都有对应的编号:如10001~10012 5 比赛方式:分组比赛 每组6人 6 第 ...

  3. pikachu RCE远程系统命令执行

    远程系统命令执行 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口比如我们常见的路由器.防火墙.入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界 ...

  4. sqli-labs lesson 26-27a

    less 26: 因为本关在windows上运行可能会出现字符转义(apacche下空格无法转义)错误,所以在docker上搭建好sqli-labs 在win2003上远程登录sqli-labs 先执 ...

  5. C# 利用反射进行深拷贝

  6. C# 单元测试,测试资源管理器里面没有需要的单元测试

    已经创建了单元测试,却无法运行,更改引用的程序集,将TestPlatform换位QualityTools.UnitTestFramework.具体原因尚未分析,随笔记录.

  7. React 性能调优记录(下篇),如何写高性能的代码

    react性能非常重要,性能优化可以说是衡量一个react程序员水平的重要标准. 减少你的渲染 这个大家都明白,只要是父组件中用了子组件,子组件就算没用prop也会进行依次渲染, 可以用pureCom ...

  8. win系统打不开CHM文件(例如JDK的API)

    打开文件乱码,打开时弹出乱码 前提说明,存放路径不得有中文,文件名也不能有中文 检查下面三个文件:    hh.exe文件放置电脑 C:\Windows目录下:     hhctrl.ocx ,its ...

  9. ES6两种静态属性的书写方法

    1.这种可以不用实例化对象就能输出. class Car{ constructor(){ } } Car.tool=4 console.log(Car.tool);//4 2.必须实例化后才能输出.但 ...

  10. 媒体查询media query

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...