• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Laravel如何实现自动加载类

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

    Laravel如何实现自动加载类

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

    首先看 vendor/autoload.php文件

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

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

    看一下部分代码

      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()方法,看剩下部分代码

    $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);

    这个方法比较重要

     public function register($prepend = false)
     {
      spl_autoload_register(array($this, 'loadClass'), true, $prepend);
     }

    注册了loadClass方法,并且是放在队列的head。

    查看loadClass方法

     /**
      * 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如何实现自动加载类就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • PHP自动加载机制实例详解
    • Laravel 加载第三方类库的方法
    上一篇:解决laravel资源加载路径设置的问题
    下一篇:laravel 自定义常量的两种方案
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Laravel如何实现自动加载类 Laravel,如何,实现,自动,加载,