PHP 自动加载
回顾
开始的时候, 如果想在一个php文件中使用其它文件的类或方法, 需要通过include/require方法将文件包含进来. 这种方法的缺点也很明显:
- 如果需要引入很多文件, 就需要很多的include语句, 不仅不美观, 而且也难免会又遗漏
- 如果多个文件中定义了相同名称的常量, 会导致抛出重复定义的警告
autoload
为了解决这个问题, 在PHP5中引入了自动加载的概念, 通过 __autoload 函数来实现, 如下:
function __autoload($classname){
// 完成 指定名称类的加载任务
include_once($classname.'.php')
}
将这个函数定义在文件中, 当遇到未引入的类时, 会调用此函数进行引入, 看起来貌似很好, 我们只需要将此函数定义在也给PHP文件中, 以后我们的每个文件就只需要引入这一个自动加载文件就可以了, 看起来完事大吉.
但通过使用, 这种方式也存在很多问题:
- 因为PHP不能出现同名函数, 所以当出现两个自动加载函数时, 会报错. 当然, 自己的项目可以保证, 但我们还是要引入第三方库的啊.
- 所有的函数映射都放到一个函数中, 势必造成函数的臃肿, 同时也不利于维护
很明显, 问题就出在了, 这是一个全局函数, 只能够定义一次,
spl_autoload
那么如何解决这个问题呢? PHP引入了一个扩展库, 可以定义多个自动加载函数, 在查找的时候会依次调用定义好的自动加载函数进行加载, 有如下方法:
- spl_autoload_register: 注册自动加载函数
- spl_autoload_unregister: 删除已注册的自动加载函数
- spl_autoload_functions: 获取所有注册的自动加载函数
- spl_autoload_call: 依次调用所有注册的自动加载函数进行加载
- spl_autoload: 自动加载函数的默认实现, 若没有进行注册, 默认调用此函数
- spl_autoload_extionsions: 注册并返回 spl_autoload 中使用的默认文件扩展名
有了它, 我们就可以定义多个自动加载函数了.
下面是一个例子:
test01.php
namespace test01;
class test{
public static function tt(){
echo 'test01';
}
}
test02.php
namespace test02;
class test{
public static function tt(){
echo 'test02';
}
}
run.php
spl_autoload_register(function ($classname){
include_once $classname.'01.php';
});
spl_autoload_register(function ($classname){
include_once $classname.'02.php';
});
use test01\test;
test::tt();
运行run.php, 报错:
Warning: include_once(test01\test01.php): failed to open stream: No such file or directory in
打印传入的 $classname, 发现是: test01\test
也就是说, 我们使用的时候可以将命名空间与路径相对应, 关于这个好像还有一个标准, 具体记不清了.
这样一对应, 有没有感觉和java中的包有些一样了, 反正我是觉得挺像.
composer
好了, 现在通过 composer来管理第三方库, 它将自动加载都做好了, 只要引入他的 autoload.php 文件就可以了.
composer提供了几种类型的自动加载
1.psr-4
大概就是我们上面说的路径和命名空间对应的形式
2. classmap
保存各个类与文件的映射map
等等吧, 没有具体研究, 不过大体是对自动加载的封装, 很方便.
简单总结一下, 才疏学浅..
PHP 自动加载的更多相关文章
- BPM配置故事之案例3-参与者与数据自动加载
这才过了两天,阿海又来了. 阿海:公司决定改进管理方式,以后物资申请的申请人和申请部门要写具体使用人的名字和部门了. 小明:不是要让我改回去吧? 阿海:那太麻烦了,你能不能把申请人改成选择,选好人自动 ...
- Composer概述及其自动加载探秘
composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具 ...
- 让Lua自己把文件夹下面的所有文件自动加载起来吧
没有想到我也做了一回标题党.其实这里边说的自动还是有夸大其词的部分.其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已. 怎么来进行Lua文件的加载 一般情况下,相关的功能需要给他创建 ...
- 如何实现一个php框架系列文章【3】支持psr4的自动加载类
psr4自动加载规范https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-4-autoloader-cn.md 我们把第三方使用psr规范的类库放在v ...
- PHP 自动加载规范PSR-4
.note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...
- 构建自己的PHP框架之自动加载类中详解spl_autoload_register()函数
在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.c ...
- jquery 页面滚动到底部自动加载插件集合
很多社交网站都使用无限滚动的翻页技术来提高用户体验,当你页面滑到列表底部时候无需点击就自动加载更多的内容.下面为你推荐 10 个 jQuery 的无限滚动的插件: 1. jQuery ScrollPa ...
- 自动加载dll,加载dll中程序集的信息。
自动加载程序集,解析程序集中的方法. private static object Invoke(string lpFileName, string Namespace, string ClassNam ...
- 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...
- autocad2008+C#2008开发中设置自动加载dll
一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...
随机推荐
- Lniux系统-Ubantu安装搜狗输入法
1.在官网下载搜狗输入法的安装包-https://pinyin.sogou.com/linux/?r=pinyin 2.终端打开,进行解压安装--sudo dpkg -i sogoupinyin_2. ...
- Python对 Excel 的常用操作
几个常用的对象 Workbook:工作簿,一个包含多个Sheet的Excel文件 Worksheet:工作表,一个Workbook有多个Worksheet,如"Sheet1",&q ...
- 9. Vue - vue-cli
一.前端开发工具 1. Node.js Node.js是一个基于Chrome v8引擎的JavaScript运行环境.JavaScript本来只能跑在浏览器上,然后Node.js就是一种能让js直 ...
- 201871010116-祁英红《面向对象程序设计(java)》第七周学习总结
项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...
- 【JS】JS数组添加元素的三种方法
1.push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 1).语法: arrayObject.push(newelement1,newelement2,....,newelement ...
- 一文学会 TypeScript 的 82% 常用知识点(上)
前端专栏 2019-11-22 19:17:55 对于前端从业者来说,TypeScript(以下简称 TS)已经不算是新技术. Vue3 的源码基于 TS 编写, Angular 项目默认支持 TS ...
- Tree-Shaking性能优化实践 - 原理篇
Tree-Shaking性能优化实践 - 原理篇 一. 什么是Tree-shaking 先来看一下Tree-shaking原始的本意 上图形象的解释了Tree-shaking 的本意,本文所说的前 ...
- sqoop的详细使用及原理
转自:https://blog.csdn.net/zhusiqing6/article/details/95680185 1.sqoop简介sqoop是一个用来将hadoop中hdfs和关系型数据库中 ...
- Containers vs Serverless:本质区别是什么?
在云计算领域,容器和无服务器计算已经占据了发展前列. 作者 | Emra Samdan 翻译 | bocloudresearch 一点历史 在不久以前,应用程序的开发.部署和维护要比现在复杂得多,耗时 ...
- Java设计模式:Singleton(单例)模式
概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...