Laravel使用的是composer
的自动加载。 首先看 vendor/autoload.PHP
文件
1 2 3 4 <?php require_once __DIR__ . '/composer/autoload_real.php' ;return ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3 ::getLoader ();
代码很少,查看__DIR__ . '/composer/autoload_real.php'
文件。 有一个类ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3
,该类的名字比较奇特,主要为了防止重名。回到上面的代码,可以看到调用了getLoader()
方法; 看一下部分代码
1 2 3 4 5 6 if ( null !== self ::$loader { return self ::$loader ; } spl_autoload_register (array ('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3' ,'loadClassLoader' ), true , true );self ::$loader = $loader = new \Composer\Autoload\ClassLoader ();spl_autoload_unregister (array ('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3' ,'loadClassLoader' ));
这里自动加载了当前类的loadClassLoader
静态方法,该方法加载了__DIR__ . '/ClassLoader.php'
文件,该文件中的类起到了整个框架类自动加载的作用。 回到autoload_real.php
文件的getLoader()
方法,看剩下部分代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $useStaticLoader = PHP_VERSION_ID >=50600 && !defined ('HHVM_VERSION' ) && (!function_exists ('zend_loader_file_encoded' ) || !zend_loader_file_encoded ());if ($useStaticLoader ) { require_once __DIR__ . '/autoload_static.php' ; call_user_func (\Composer\Autoload\ComposerStaticInit5586036d8fdd45ae351f9a5ae924a5a3 ::getInitializer ($loader )); } else { $map = require __DIR__ . '/autoload_namespaces.php' ; foreach ($map as $namespace => $path ) { $loader ->set ($namespace , $path ); } $map = require __DIR__ . '/autoload_psr4.php' ; foreach ($map as $namespace => $path ) { $loader ->setPsr4 ($namespace , $path ); } $classMap = require __DIR__ . '/autoload_classmap.php' ; if ($classMap ) { $loader ->addClassMap ($classMap ); } }
这里主要加载一些自动加载类相关的资源。
随后调用$loader->register(true);
这个方法比较重要
1 2 3 4 public function register ($prepend = false ) { spl_autoload_register (array ($this , 'loadClass' ), true , $prepend ); }
注册了loadClass
方法,并且是放在队列的head。
查看loadClass
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 public function loadClass ($class ) { if ($file = $this ->findFile ($class )) { includeFile ($file ); return true ; } }
当实例化类的时候,找不到类,就自动会调用该方法,该方法加载了需要的类,这个方法十分重要。
现在看一下$this->findFile($class)
方法内使用了之前getLoader()
方法加载的相关资源。
现在整个Laravel
框架如何自动加载类已经很明显了。每当实例化类的时候,会自动调用ClassLoader的loadClass
方法,加载需要的类。