Laravel如何实现自动加载类

吾爱主题 阅读:104 2021-09-02 17:05:00 评论:0

本人水平有限,如有错误望告知,谢谢!

Laravel如何实现自动加载类

Laravel使用的是composer的自动加载。

首先看 vendor/autoload.php文件

?
1 2 3 4 <?php // autoload.php @generated by Composer require_once __DIR__ . '/composer/autoload_real.php' ; return ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3::getLoader();

代码很少,查看__DIR__ . '/composer/autoload_real.php'文件。 有一个类ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3,该类的名字比较奇特,主要为了防止重名。回到上面的代码,可以看到调用了getLoader()方法;

看一下部分代码

?
1 2 3 4 5 6 7 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 21 $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 14 /**   * Loads the given class or interface.   *   * @param string $class The name of the class   * @return bool|null True if loaded, null otherwise   */ public function loadClass( $class ) {   if ( $file = $this ->findFile( $class )) {    includeFile( $file );      return true;   } }

当实例化类的时候,找不到类,就自动会调用该方法,该方法加载了需要的类,这个方法十分重要。

现在看一下$this->findFile($class)方法内使用了之前getLoader()方法加载的相关资源。

现在整个Laravel框架如何自动加载类已经很明显了。每当实例化类的时候,会自动调用 ClassLoader的loadClass方法,加载需要的类。

以上这篇Laravel如何实现自动加载类就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/sweatOtt/article/details/55001209

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容