Laravel如何实现自动加载类
本人水平有限,如有错误望告知,谢谢!
Laravel如何实现自动加载类
Laravel使用的是composer的自动加载。
首先看vendor/autoload.php文件
代码很少,查看__DIR__.'/composer/autoload_real.php'文件。有一个类ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3,该类的名字比较奇特,主要为了防止重名。回到上面的代码,可以看到调用了getLoader()方法;
看一下部分代码
if(null!==self::$loader){ returnself::$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()方法,看剩下部分代码
$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($mapas$namespace=>$path){ $loader->set($namespace,$path); } $map=require__DIR__.'/autoload_psr4.php'; foreach($mapas$namespace=>$path){ $loader->setPsr4($namespace,$path); } $classMap=require__DIR__.'/autoload_classmap.php'; if($classMap){ $loader->addClassMap($classMap); } }这里主要加载一些自动加载类相关的资源。
随后调用$loader->register(true);
这个方法比较重要
publicfunctionregister($prepend=false) { spl_autoload_register(array($this,'loadClass'),true,$prepend); }注册了loadClass方法,并且是放在队列的head。
查看loadClass方法
/** *Loadsthegivenclassorinterface. * *@paramstring$classThenameoftheclass *@returnbool|nullTrueifloaded,nullotherwise */ publicfunctionloadClass($class) { if($file=$this->findFile($class)){ includeFile($file); returntrue; } }当实例化类的时候,找不到类,就自动会调用该方法,该方法加载了需要的类,这个方法十分重要。
现在看一下$this->findFile($class)方法内使用了之前getLoader()方法加载的相关资源。
现在整个Laravel框架如何自动加载类已经很明显了。每当实例化类的时候,会自动调用ClassLoader的loadClass方法,加载需要的类。
以上这篇Laravel如何实现自动加载类就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。