定位

  • 从 public/index.php 定位到 bootstrap/autoload.php
  • 从 bootstrap/autoload.php 定位到 vendor/autoload.php
  • 从 vendor/autoload.php 定位到 __DIR__ . '/composer' . '/autoload_real.php';

定位完毕,你会看到这样的代码:

return ComposerAutoloaderInit2bf9ae5262a23b284c9433508d41d77f::getLoader();

ComposerAutoloaderInit2bf9ae5262a23b284c9433508d41d77f 简称本类。

那我们就从 getLoader() 方法入手。

getLoader()

文件位于: __DIR__ . '/composer' . '/autoload_real.php';

逻辑顺序:

一、如果静态变量 $loader 不为空则返回 $loader

二、注册一个自动加载程序,加载程序为本类的 loadClassLoader() 方法,

[loadClassLoader 方法逻辑]


静态方法,含有一个 $class 参数,判断如果 $class 等于 Composer\Autoload\ClassLoader,则载入当前目录下
的 ClassLoader.php 文件,实际上是在为这句代码工作:self::$loader = $loader = new \Composer\Autoload\ClassLoader();


三、 $loader 得到 ClassLoader 类(\Composer\Autoload\ClassLoader)的一个实例,卸载自动加载程序 loadClassLoader,

四、载入路径信息,设置路径信息,

五、载入一些 autoload_x.php 形式的文件,


分别有:

  • autoload_namespaces.php
  • autoload_psr4.php
  • autoload_classmap.php

并进行各自的循环 set 操作,如 $loader->set($namespace, $path);

【set 函数】2 个参数,一个前缀,一个路径。如果前缀非真,将 paths 转为数组类型赋值给类成员变量 fallbackDirsPsr0,如果前缀为真,则将路径赋值给
$this->prefixesPsr0[$prefix[0]][$prefix] ,这个写法的意思等同于字母索引,比如 phpDocumentor ,则数组就图所示:


六、执行一个 $loader->register(true);

[register 方法逻辑]


一个布尔值参数,将传给 spl_autoload_register 第三个参数中。
而自动加载程序为:array($this, 'loadClass'),也就是本类的 loadClass() 方法。

[loadClass 方法逻辑]

一个 $class 参数,用了 findFile() 方法判断文件是否存在,存在则调用函数 includeFile() 载入文件。

注意:这个函数也在本类中直接定义了的。


七、还载入了一个 autoload_files.php,而里面也是一组文件数组,貌似预加载一些函数库文件吧,没有继续深入这里了。

八、最后返回一个 $loader 变量,也就是 ClassLoader 类的实例。

好了,现在看看 $loader 这个实例到此拥有些什么?部分截图所示:

可以看出类属性包含了具有字母索引的一些命名空间,文件路径等信息。这和刚才载入那几个文件进行 set 操作有关,想起来了吗?

到此 getLoader() 方法逻辑结束。

总结

实现自动化的关键代码是 vendor/autoload.php 的 ::getLoader() 静态方法,
利用此方法内部的 $loader->register(true); 方法注册自动化载入方法,这样,当 new 对象的时候自动触发 loadClass() 了,而上面提到的 set 一些路径信息,正是自动化的必备条件,如有兴趣可以自行查看 vendor/composer/ClassLoader.php 的 loadClass() 方法代码细节。

上面如果没懂的,请打开文件代码,跟着慢慢走,慢慢看,一定能懂。

在返回到 vendor/autoload.php,在把 return $loader 返回到上一层。
即 bootstrap/autoload.php,
这行的代码 require __DIR__.'/../vendor/autoload.php';
我们 var_dump() 下 require 的返回值,和刚才 $loader 的部分截图完全一致。
其实有从 aotuload_real.php 文件开始,我尝试过删除 return,也没有任何报错,不知道这里的 return 意义为何。

可是还没有看到真正 new, 我们知道了原理,得看看它在哪调用了?
在看 index.php 定位到了 bootstrap/app.php
打开就看到第一个

$app = new Illuminate\Foundation\Application(     realpath(__DIR__.'/../') );

Laravel 执行流程(一)之自动加载的更多相关文章

  1. Laravel 学习笔记之 Composer 自动加载

    说明:本文主要以Laravel的容器类Container为例做简单说明Composer的自动加载机制. Composer的自动加载机制 1.初始化一个composer项目 在一个空目录下compose ...

  2. composer自动加载一个文件后必须执行命令composer dump-autoload

    "autoload": { "classmap": [ "database" ], "psr-4": { "A ...

  3. laravel 自动加载 自定义的文件/辅助函数

    需求 在 laravel 中自定义了一些 辅助函数,想要laravel框架自动加载这些函数 实现 将自定义的辅助函数放在helpers.php文件中,如下: 在compsoer.json 的 auto ...

  4. laravel框架源码分析(一)自动加载

    一.前言 使用php已有好几年,laravel的使用也是有好长时间,但是一直对于框架源码的理解不深,原因很多,归根到底还是php基础不扎实,所以源码看起来也比较吃力.最近有时间,所以开启第5.6遍的框 ...

  5. [转]在BBB启动时自动加载dtbo(或执行脚本、运行程序)

    启动时自动加载dtbo,实际上就是做了一个cape.官方推荐的方法是用eeprom来实现,请参考我的博文<为BBB制作专属自己的cape(一)>和<为BBB制作专属自己的cape(四 ...

  6. 深入解析 composer 的自动加载原理 (转)

    深入解析 composer 的自动加载原理 转自:https://segmentfault.com/a/1190000014948542 前言 PHP 自5.3的版本之后,已经重焕新生,命名空间.性状 ...

  7. 深入解析 composer 的自动加载原理

    PHP 自5.3的版本之后,已经重焕新生,命名空间.性状(trait).闭包.接口.PSR 规范.以及 composer 的出现已经让 PHP 变成了一门现代化的脚本语言.PHP 的生态系统也一直在演 ...

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

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

  9. CI框架源码阅读笔记9 CI的自动加载机制autoload

    本篇并不是对某一组件的详细源码分析,而只是简单的跟踪了下CI的autoload的基本流程.因此,可以看做是Loader组件的分析前篇. CI框架中,允许你配置autoload数组,这样,在你的应用程序 ...

随机推荐

  1. 潭州课堂25班:Ph201805201 爬虫高级 第十课 Scrapy-redis分布 (课堂笔记)

    利用 redis 数据库,做 request 队列,去重,多台数据共享, scrapy 调度 基于文件每户,默认只能在单机运行, scrapy-redis 默认把数据放到 redis 中,实现数据共享 ...

  2. python网络编程(十一)

    epoll版-TCP服务器 1. epoll的优点: 没有最大并发连接的限制,能打开的FD(指的是文件描述符,通俗的理解就是套接字对应的数字编号)的上限远大于1024 效率提升,不是轮询的方式,不会随 ...

  3. 2017.08.05【NOIP提高组】模拟赛B组

    Summary 这次比赛打得非常差,第一题我以为是个难题,于是推了一下就没再去想了,然而考场上一堆人AC.第二题状态设错了,导致结果有后效性.结束后pascal卡常卡了36次.第三题别人n²就过了,我 ...

  4. Linux内容

    1.“~”:当前用户主目录“.”:当前工作目录“..”:当前工作目录的父目录使用pwd命令可以确定当前所在目录的绝对路径$ pwd2.shell命令:(which命令判断是否是外部命令)$ which ...

  5. IDEA15 创建javaweb 并配置Tomcat(转)

    1.打开IDEA选择Web Application 2.在WEB-INF下创建如图两个文件夹 3.在右上角找到这个,准备配置Tomcat 4.在弹出的窗口里像这样配置LocaleHost 5.设置好本 ...

  6. nested exception is java.lang.ClassNotFoundException

    当出现nested exception is java.lang.ClassNotFoundException这个异常的时候,首先排查类是否存在.如果存在,是maven项目的话,clean.insta ...

  7. HTML常用标签3

    1.<a>标签,是内联标签 href:需要跳转的网址 2.id属性: 相当于一个身份证 例如: 设置id属性 3.列表标签 <ul>: 无序列表 [type属性:disc(实心 ...

  8. openstack 之~云计算介绍

    认识云计算 第一:什么是云计算? 对于云计算事什么有很多种解释方式 美国国家标准局(NIST):认为云计算是一种方便的模式,按需网络访问可配置的计算资源共享池(例如,网络.服务器.存储.应用和服务), ...

  9. 【小程序】小程序开发自定义组件的步骤>>>>>>>>>小程序开发过程中报错:jsEnginScriptError

    报错:jsEnginScriptError VM6342: jsEnginScriptError Component is not found in path "component/spac ...

  10. 搭建memcached使用:/usr/bin/phpize 安装memcached扩展的时候报错

    Can't find PHP headers in /usr/include/phpThe php-devel package is required for use of this command ...