回顾

开始的时候, 如果想在一个php文件中使用其它文件的类或方法, 需要通过include/require方法将文件包含进来. 这种方法的缺点也很明显:

  1. 如果需要引入很多文件, 就需要很多的include语句, 不仅不美观, 而且也难免会又遗漏
  2. 如果多个文件中定义了相同名称的常量, 会导致抛出重复定义的警告

autoload

为了解决这个问题, 在PHP5中引入了自动加载的概念, 通过 __autoload 函数来实现, 如下:

function __autoload($classname){
// 完成 指定名称类的加载任务
include_once($classname.'.php')
}

将这个函数定义在文件中, 当遇到未引入的类时, 会调用此函数进行引入, 看起来貌似很好, 我们只需要将此函数定义在也给PHP文件中, 以后我们的每个文件就只需要引入这一个自动加载文件就可以了, 看起来完事大吉.

但通过使用, 这种方式也存在很多问题:

  1. 因为PHP不能出现同名函数, 所以当出现两个自动加载函数时, 会报错. 当然, 自己的项目可以保证, 但我们还是要引入第三方库的啊.
  2. 所有的函数映射都放到一个函数中, 势必造成函数的臃肿, 同时也不利于维护

很明显, 问题就出在了, 这是一个全局函数, 只能够定义一次,

spl_autoload

那么如何解决这个问题呢? PHP引入了一个扩展库, 可以定义多个自动加载函数, 在查找的时候会依次调用定义好的自动加载函数进行加载, 有如下方法:

  1. spl_autoload_register: 注册自动加载函数
  2. spl_autoload_unregister: 删除已注册的自动加载函数
  3. spl_autoload_functions: 获取所有注册的自动加载函数
  4. spl_autoload_call: 依次调用所有注册的自动加载函数进行加载
  5. spl_autoload: 自动加载函数的默认实现, 若没有进行注册, 默认调用此函数
  6. 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 自动加载的更多相关文章

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

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

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

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

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

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

  4. 如何实现一个php框架系列文章【3】支持psr4的自动加载类

    psr4自动加载规范https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-4-autoloader-cn.md 我们把第三方使用psr规范的类库放在v ...

  5. PHP 自动加载规范PSR-4

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  6. 构建自己的PHP框架之自动加载类中详解spl_autoload_register()函数

    在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.c ...

  7. jquery 页面滚动到底部自动加载插件集合

    很多社交网站都使用无限滚动的翻页技术来提高用户体验,当你页面滑到列表底部时候无需点击就自动加载更多的内容.下面为你推荐 10 个 jQuery 的无限滚动的插件: 1. jQuery ScrollPa ...

  8. 自动加载dll,加载dll中程序集的信息。

    自动加载程序集,解析程序集中的方法. private static object Invoke(string lpFileName, string Namespace, string ClassNam ...

  9. 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

    很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...

  10. autocad2008+C#2008开发中设置自动加载dll

    一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...

随机推荐

  1. MATLAB实例:对称双随机矩阵

    MATLAB实例:对称双随机矩阵 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 双随机矩阵(doubly stochastic matrix):元素属 ...

  2. SPA项目开发之tab页实现

    实现思路及细节 1.利用前面博客所讲的Vuex的知识:定义几个变量 Options:存放tab页对象的容器(主要是路由路径以及tab页的名字) activeIndex:被激活的tab页路由路径 sho ...

  3. 页面一刷新让文本框自动获取焦点-- 和自定义v-focus指令

    <body> <div id="app"> <input type="text" value="" id=&q ...

  4. oracle xmltype + blob + clob

    oracle varchar2最大存储长度为4000,所以当字段长度超限时可尝试存储为blob或xmltype格式 xmltype --1.创建xml表 Create TABLE testxml( i ...

  5. WPF 获取系统 DPI 的多种方法

    原文:WPF 获取系统 DPI 的多种方法 WPF 获取系统 DPI 的多种方法 由于 WPF 的尺寸单位和系统的 DPI 相关,我们有时需要获取 DPI 值来进行一些界面布局的调整,本文汇总了一些 ...

  6. TensorFlow2教程(目录)

    第一篇 基本操作 01 Tensor数据类型 02 创建Tensor 03 Tensor索引和切片 04 维度变换 05 Broadcasting 06 数学运算 07 前向传播(张量)- 实战 第二 ...

  7. Global Azure Bootcamp 2019 宁波站活动总结

    4月27日,由微软MVP技术社区发起的Global Azure Bootcamp 2019盛会在全球80多个国家270个城市举办.本次活动由全国众多Azure专家及微软MVP技术社区成员,分别在北京. ...

  8. iOS:从头捋一遍VC的生命周期

    一.介绍 UIViewController是iOS开发中的核心控件,没有它那基本上任何功能都无法实现,虽然系统已经做了所有控件的生命维护,但是,了解它的生命周期是如何管理还是非常有必要的.网上有很多教 ...

  9. 实时聊天-websocket与ajax的区别于联系

     Ajax是什么? Ajax,即异步JavaScript和XML,是一种创建交互式网页应用的网页开发技术.通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整 ...

  10. MySQL应用之CROSS JOIN用法简介教程

    目录 2. cross join用法 @ 本博客翻译自两篇博客的: http://www.mysqltutorial.org/mysql-cross-join/ https://www.w3resou ...