我们探索了 从
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 函数
包含两个内部的函数:
下面细分一下 getLoader()函数内部的情况,
if
(
null
!==
self
::
$loader
) {
return self
::
$loader
;
}
如果存有的话,直接返回,停止向后执行。
否则!
正式开始 自动加载的流程:
第一步:注册系统自动加载函数
spl_autoload_register(
array
(
'ComposerAutoloaderInitf0 edef8d82d469d4cfba4316d7 feb75f'
,
'loadClassLoader'
)
,
true
,
true
)
;
知识点扩展:
可以很好地处理需要多个加载器的情况,这种情况下
会按顺序依次调用之前注册过的加载器。作为对比,
因为是一个函数,所以只能被定义一次。
spl_autoload_register
这个函数:
bool
spl_autoload_register
([
callable
[,
bool
= true
[,
bool
= false
]]] )
$autoload_function
$throw
$prepend
spl_autoload_register
spl_autoload_register
__autoload
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。
throw
此参数设置了 autoload_function
prepend
如果是 true,spl_autoload_register()
会添加函数到队列之首,而不是队列尾部。
上述用法解析为:自动加载 类的 loadClassLoader 函数,如果添加异常,则抛出异常, 后面的true 代表 添加的 序列 之首。
然后回到正途:
第二步:实例化 这个 ClassLoader 类
self::
$loader
=
$loader
=
new
\Composer\Autoload\ClassLoader()
;
并且赋值给 当前的单例句柄。
第三步:删除已经注册的自动加载函数
spl_autoload_unregister
—
注销已注册的__autoload()函数
综合上述三步:就是为了 能够 让 self::$laoder = $loader 能够被实例化!
如果,仅仅是为了实现这个,我觉得,还不如,直接
就自动加载函数文件。
接下来手下加载命名空间:
1
$map
=
require
__DIR__
.
'/autoload_namespaces.php'
;
2
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
)
;
foreach
}
$this
->
prefixDirsPsr4
[
$prefix
] = (array)
$paths
;
第三:
$classMap
=
require
__DIR__
.
'/autoload_classmap.php'
;
if
(
$classMap
) {
$loader
->addClassMap(
$classMap
)
;
if
}
$this
->
classMap
= array_merge(
$this
->
classMap
,
$classMap
)
;
注册真正的 spl_autoload_register 方法为 ClassLoader->loaderClass 方法,
加载全部的自动加载的文件
$includeFiles
=
require
__DIR__
.
'/autoload_files.php'
;
foreach
(
$includeFiles
as
$fileIdentifier
=>
$file
) {
composerRequiref0edef8d8 2d469d4cfba4316d7feb75f(
$fileIdentifier
,
$file
)
;
foreach
}
返回 实例化的 后的处理类对象。
处理完成
总结:
1 就是按照 各种标准 加载 命名空间对应的路径
2 按照psr4标准 加载命名空间对应的路径
3 加载 系统需要加载的类文件
4 注册自动加载函数
5
加载 帮助函数
php初学者-千锋php课程笔记