当前位置:编程学习 > > 正文

laravel自动分解大任务(Laravel如何实现自动加载类)

时间:2021-10-03 01:33:02类别:编程学习

laravel自动分解大任务

Laravel如何实现自动加载类

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

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

    上一篇下一篇

    猜您喜欢

    热门推荐