分析Composer实现自动加载原理
1. 入口文件
(/public/index.php)中引入了 autoload.php
2. autoload.php
3. autoload_real.php
可以看出这一段是 composer 自动加载的重点,首先在 autoload.php 中调用
composerautoloaderinit1215780529014c2b50a6fca7ce889273::getloader () 方法,getloader () 首先判断当前loader是不是null,如果不为null就直接返回,否则就初始化一个classloader类给赋值给 loader 是不是 null,如果不为 null 就直接返回,否则就初始化一个 classloader 类给赋值给 loader,接着将 autoload_namespaces.php、autoload_psr4.php、autoload_classmap.php 文件中的内容加入到 $loader 中对应的数组中,然后给注册 loadclass 函数,将 autoload_files.php 中的所有路径所示的文件都包含进来,当在 new 一个类的时候如果没有找到相关的类就会触发这个 loadclass 函数,在 loadclass () 又调用了 findfile () 去查找相应的文件,找到相应文件后就会返回该文件,然后 loadclass 调用 includefile () 方法将该文件 include 进去,否则 findfile 返回 false,这样就完成了自动加载
4. findfile ()
findfile () 函数先在 classmap 中查找,如果找不到的话就会尝试在 apcu 缓存中查找,如果还是找不到的话就会调用 findfilewithextension () 函数查找,如果找到了就会将该文件加到apcu缓存,如果找不到的话就会在 missingclasses 数组中设一个标记表示识这个类找不到findfilewithextension()方法根据之前通过loader->set(loader−>set(namespace, path)和path)和loader->setpsr4(namespace,namespace,path)方法设置的信息找出类文件的路径信息
5. spl_autoload_register和spl_autoload_unregister函数
1. spl_autoload_register 函数
1.spl_autoload_register — 注册给定的函数作为 __autoload 的实现,
bool spl_autoload_register([callable autoloadfunction[,boolautoloadfunction[,boolthrow = true [, bool $prepend = false ]]])
2.prepend
如果是 true,spl_autoload_register () 会添加函数到队列之首,而不是队列尾部。
3.如果在你的程序中已经实现了 autoload () 函数,它必须显式注册到 autoload () 队列中。因为 spl_autoload_register () 函数会将 zend engine 中的__autoload () 函数取代为 spl_autoload () 或 spl_autoload_call ()
例:
function __autoload($name) { require 'class/'.$name.'.php'; echo '1'; } function autoload_test($name) { echo '2'; } spl_autoload_register('autoload_test'); spl_autoload_register('__autoload'); $ca=new ca();
2. spl_autoload_unregister 函数
spl_autoload_unregister — 注销已注册的 autoload () 函数,如果该函数队列处于激活状态,并且在给定函数注销后该队列变为空,则该函数队列将会变为无效。如果该函数注销后使得自动装载函数队列无效,即使存在有 autoload 函数它也不会自动激活。
bool spl_autoload_unregister ( mixed $autoload_function )
以上就是分析composer实现自动加载原理的详细内容,更多关于composer实现自动加载原理的资料请关注其它相关文章!