我们以yii2-basic为源码阅读剖析目标,首先,请到http://www.yiichina.com/download 下载框架源码。
接下来就开始我们的yii2源码阅读之旅吧。
请注意:由于本人会在阅读过程中写入各种注释,有可能导致文章中的代码所在行与实际框架中所在行有出入
请注明文章来源:http://blog.csdn.net/lambert310
从入口脚本index.php开始:
入口脚本为:web/index.php,这是整个yii2的启动入口:
↑index.php全部内容(请注明文章来源:http://blog.csdn.net/lambert310)
4、5行见注释即可,我们直接从第7行的类加载器开始,它引入了上一层目录下vendor/autoload.php,其源码如下:
↑autoload.php全部内容
第5行引入了当前目录下/composer/autoload_real.php,然后在第7行调用了getLoader()这个静态方法,我们继续跟踪:
↑autoload_real.php(1-31行)
在这里看从16行的getLoader()开始,具体可以见代码注释,在第28行将$loader实例化,ClassLoader.php的具体代码稍后剖析,咱们继续往下:
↑autoload_real.php(32-55行),请注明文章来源:http://blog.csdn.net/lambert310
在这里,由于咱们使用的开发环境是php7.0.6,所以$useStaticLoader为True,接下来引入autoload_static.php,相当于引入了下面的这个ComposerStaticInit9f9e4e27e79990b4ee47bd62041b34f3类,然后调用了getInitializer方法并传入前面的$loader作为参数:
↑autoload_static.php(687行--697行),(请注明文章来源:http://blog.csdn.net/lambert310)
在这里使用了闭包,具体效果相当于把本类中的多个成员变量绑给了$loader,我们看到这里的$prefixLengthsPsr4,其实就是一个二维数组:
↑autoload_static.php(16行--31行)
然后下一个$prefixDirsPsr4:
↑autoload_static.php(77行--101行)
最后把$classMap也绑到loader上,$classMap保存了类到文件的直接映射:
↑autoload_static.php(228行--239行)
然后返回,这样就把这些属性配置绑定到了$loader上。
现在让我们回到autoload_real.php,从56行开始:
↑autoload_real.php(56行--79行)
让我们看到第57行,这里调用了$loader自身的register方法并传入了一个参数为true:
↑ClassLoader.php(279行--282行)
然后我们回到autoload_real.php,往下看到59行,这里由于$useStaticLoader为True,所以把
autoload_static.php中ComposerStaticInit9f9e4e27e79990b4ee47bd62041b34f3这个类中的$file数组取出:
↑autoload_statis.php(7行--15行)
然后回到前面autoload_real.php的64行,这里把$file中的各文件都require了一遍。
到这里,咱们的第一篇:《从入口脚本index.php到类加载器的初始化》,就剖析完毕了,
下一次会带来应用主体初始化的剖析。