自动加载函数流程之composer autoload_real.php

我们探索了 从
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()函数内部的情况,
        首先进行了 单列变量的一个判读 也就是说 $loader 变量 里面是否存有相关数据
if  ( null  !==  self :: $loader ) {
   
  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::$laoder = $loader 能够被实例化!
如果,仅仅是为了实现这个,我觉得,还不如,直接
就自动加载函数文件。

接下来手下加载命名空间:
$map  =  require  __DIR__  . '/autoload_namespaces.php' ;
foreach  ( $map  as  $namespace  =>  $path ) {
   
  $loader ->set( $namespace ,  $path ) ;
}
同 ClassLoader.php 里面的 set函数 把 文件存入变量 仓库
$this -> prefixesPsr0 [ $prefix [ 0 ]][ $prefix ] = (array)  $paths ;
注意:这里的0是我们的 第一个字母。

第二步:注册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 注册自动加载函数
加载 帮助函数


互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值