Laravel 执行流程(一)之自动加载
定位
- 从 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 执行流程(一)之自动加载的更多相关文章
- Laravel 学习笔记之 Composer 自动加载
说明:本文主要以Laravel的容器类Container为例做简单说明Composer的自动加载机制. Composer的自动加载机制 1.初始化一个composer项目 在一个空目录下compose ...
- composer自动加载一个文件后必须执行命令composer dump-autoload
"autoload": { "classmap": [ "database" ], "psr-4": { "A ...
- laravel 自动加载 自定义的文件/辅助函数
需求 在 laravel 中自定义了一些 辅助函数,想要laravel框架自动加载这些函数 实现 将自定义的辅助函数放在helpers.php文件中,如下: 在compsoer.json 的 auto ...
- laravel框架源码分析(一)自动加载
一.前言 使用php已有好几年,laravel的使用也是有好长时间,但是一直对于框架源码的理解不深,原因很多,归根到底还是php基础不扎实,所以源码看起来也比较吃力.最近有时间,所以开启第5.6遍的框 ...
- [转]在BBB启动时自动加载dtbo(或执行脚本、运行程序)
启动时自动加载dtbo,实际上就是做了一个cape.官方推荐的方法是用eeprom来实现,请参考我的博文<为BBB制作专属自己的cape(一)>和<为BBB制作专属自己的cape(四 ...
- 深入解析 composer 的自动加载原理 (转)
深入解析 composer 的自动加载原理 转自:https://segmentfault.com/a/1190000014948542 前言 PHP 自5.3的版本之后,已经重焕新生,命名空间.性状 ...
- 深入解析 composer 的自动加载原理
PHP 自5.3的版本之后,已经重焕新生,命名空间.性状(trait).闭包.接口.PSR 规范.以及 composer 的出现已经让 PHP 变成了一门现代化的脚本语言.PHP 的生态系统也一直在演 ...
- Composer概述及其自动加载探秘
composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具 ...
- CI框架源码阅读笔记9 CI的自动加载机制autoload
本篇并不是对某一组件的详细源码分析,而只是简单的跟踪了下CI的autoload的基本流程.因此,可以看做是Loader组件的分析前篇. CI框架中,允许你配置autoload数组,这样,在你的应用程序 ...
随机推荐
- SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)
题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...
- for each ...in / for ...in / for...of
参考博客: https://www.cnblogs.com/ruoqiang/p/6217929.html https://www.cnblogs.com/dupd/p/5895474.html 1 ...
- React生命周期函数详解
React生命周期函数 生命周期函数是指在某一个周期自动执行的函数. React中的生命周期执行过程 以下是React中的常用的生命周期函数,按个部分中按照自动执行顺序列出,这几个过程可能存在同时进行 ...
- Python基础-字符串、集合类型、判断、深拷贝与浅拷贝、文件读写
字符串 1.定义三个变量: 2.交换两个变量值 1)引入第三个变量: 2)Python引入第三方变量: 3)不引入第三方变量: 3. isalpha 是否是汉字或字母 4.Isalnum 是否是汉字 ...
- vue要点记录(待更新)
Vue实例 每个 Vue 实例都会代理其 data 对象里所有的属性:vm.a===data.a //true 注意只有这些被代理的属性是响应的. 如果在实例创建之后添加新的属性到实例上,它不会触发视 ...
- [原创]Robo 3T 1.2.1 工具使用介绍
[原创]Robo 3T 1.2.1 工具使用介绍 1 Robo 3T 1.2.1 简介 robo 3t 是一款MongoDB的辅助插件,可以帮助您在管理数据库内容以及数据库代码编辑方面提供一定的开发 ...
- CSS魔法堂:Transition就这么好玩
前言 以前说起前端动画必须使用JS,而CSS3为我们带来transition和@keyframes,让我们可以以更简单(声明式代替命令式)和更高效的方式实现UI状态间的补间动画.本文为近期对Tran ...
- socket.io的websocket示例
写了一个简单的demo,直接上代码吧.用的时候注意一下版本号,可能 socket.io 的 API 有修改~ 效果图 index.html <!DOCTYPE <!DOCTYPE html ...
- SuppressLint错误
解决方法:找到注解包,添加到项目提示重复,去掉后又可以了,很奇怪,不过可以了. 方法2:把eclipse项目关闭重新打开,错误又消失了.
- c++中函数的参数传递,内联函数和默认实参的理解
1.参数传递 1)函数调用时,c++中有三种传递方法:值传递.指针传递.引用传递. 给函数传递参数,遵循变量初始化规则.非引用类型的形参一相应的实参的副本初始化.对(非引用)形参的任何修改仅作用域局部 ...