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方法,加载需要的类。