[李景山php]每天laravel[004]-自动加载函数流程之composer autoload_real.php
来源:互联网 发布:6s电信4g卡显示3g网络 编辑:程序博客网 时间:2024/06/04 17:54
我们探索了 从
1 app/public/index.php 开始
2 加载 bootstrap /autoload.php 文件
3 然后加载到 vendor / autoload.php文件
4 然后终于找到了 /vendor/composer/autoload_real.php 文件
终于开始了 真正的自动加载,在这里 他封装了一个类。
而且这个类,也是十分 奇特,是 一个 ComposerAutoLoaderInit[salt] 一个非常特殊的类! 跟自动生成是类似的。
通过静态函数 getLoader 函数,执行 内部的 方法。
我们首先看一下这个神器的文件,里面包含两个部分的内容:
1 ComposerAutoLoaderInit[salt] 类
2 composerRequire[salt] 函数
在类内部:包含 1个 私有的变量函数 就是 loader 函数
包含两个内部的函数:
1 loaderClassLoader(class):void 函数
2 getLoader():Composer\Autoload\Composer
下面细分一下 getLoader()函数内部的情况,
首先进行了 单列变量的一个判读 也就是说
return self::$loader;
}
如果存有的话,直接返回,停止向后执行。
否则!
正式开始 自动加载的流程:
第一步:注册系统自动加载函数
spl_autoload_register(array('ComposerAutoloaderInitf0edef8d82d469d4cfba4316d7feb75f', 'loadClassLoader'), true, true);
知识点扩展:
spl_autoload_register
这个函数:
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
spl_autoload_register 可以很好地处理需要多个加载器的情况,这种情况下 spl_autoload_register 会按顺序依次调用之前注册过的加载器。作为对比, __autoload 因为是一个函数,所以只能被定义一次。
autoload_function欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。
throw此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。
prepend
如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
上述用法解析为:自动加载 类的 loadClassLoader 函数,如果添加异常,则抛出异常, 后面的true 代表 添加的 序列 之首。
然后回到正途:
第二步:实例化 这个 ClassLoader 类
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
并且赋值给 当前的单例句柄。
第三步:删除已经注册的自动加载函数
spl_autoload_unregister — 注销已注册的__autoload()函数
综合上述三步:就是为了 能够 让 self::
如果,仅仅是为了实现这个,我觉得,还不如,直接
就自动加载函数文件。
接下来手下加载命名空间:
1 $map = require __DIR__ . '/autoload_namespaces.php';2 foreach ($map as $namespace => $path) { $loader->set($namespace, $path);}
同 ClassLoader.php 里面的 set函数 把 文件存入变量
第二步:注册psr4标准的文件 的命名 空间 对应的路径
$map = require __DIR__ . '/autoload_psr4.php';foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path);}$this->prefixDirsPsr4[$prefix] = (array) $paths;
第三:
$classMap = require __DIR__ . '/autoload_classmap.php';if ($classMap) { $loader->addClassMap($classMap);}$this->classMap = array_merge($this->classMap, $classMap);
注册真正的 spl_autoload_register 方法为 ClassLoader->loaderClass 方法,
加载全部的自动加载的文件
$includeFiles = require __DIR__ . '/autoload_files.php';foreach ($includeFiles as $fileIdentifier => $file) { composerRequiref0edef8d82d469d4cfba4316d7feb75f($fileIdentifier, $file);}
返回 实例化的 后的处理类对象。
处理完成
总结:
1 就是按照 各种标准 加载 命名空间对应的路径
2 按照psr4标准 加载命名空间对应的路径
3 加载 系统需要加载的类文件
4 注册自动加载函数
5 加载 帮助函数
- [李景山php]每天laravel[004]-自动加载函数流程之composer autoload_real.php
- 自动加载函数流程之composer autoload_real.php
- 自动加载函数流程之composer autoload_real.php
- [李景山php]每天laravel[002]-自动加载函数流程之bootstrap autoload.php
- [李景山php]每天laravel[003]-自动加载函数流程之vendor autoload.php
- 每天laravel[002]-自动加载函数流程之bootstrap autoload.php
- 每天laravel[002]-自动加载函数流程
- laravel composer自动加载函数
- php composer 在laravel中自动加载autoload_class.php中的配置
- 自动加载函数流程之bootstrap autoload.php
- [李景山php]每天laravel-简单的运行流程
- [李景山php] composer 使用 安装 laravel
- 使用composer自动加载php命名空间
- [李景山php]每天laravel-20160922|RedisServicProvider.php
- [李景山php]每天laravel-20160923|Hub.php
- [李景山php]每天laravel-20160924|PiplineServiceProvider.php
- [李景山php]每天laravel-20160925|Pipeline.php
- [李景山php]每天laravel-20160926|DatabasePresenceVerifier.php
- php,java实现建造者模式
- 内存区域划分(栈区,堆区,全局静态区,文字常量区,程序代码区)
- js获取当前浏览器类型 和IE浏览器版本
- root权限问题()
- DH图像工程师
- [李景山php]每天laravel[004]-自动加载函数流程之composer autoload_real.php
- OC--NSDictionary字典
- 【opencv】应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。问题解决方法
- java synchronized关键字的用法
- C++内联函数与宏定义的区别
- LeetCode-Odd Even Linked List (Java)
- 关于Jquery 中$(document).on()与$('.class').on()的区别
- C和C++的区别 03.内联函数
- 安卓使用单实例的正确方式