您的位置:首页 > 教程 > PHP编程 > Laravel如何实现自动加载类

Laravel如何实现自动加载类

2020-09-04 08:15:48 来源:易采站长站 作者:

Laravel如何实现自动加载类,方法,自动加载,加载,代码,文件

Laravel如何实现自动加载类

易采站长站,站长之家为您整理了Laravel如何实现自动加载类的相关内容。

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

Laravel如何实现自动加载类

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

首先看 vendor/autoload.php文件

<?php// autoload.php @generated by Composerrequire_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如何实现自动加载类的详细介绍。欢迎大家对Laravel如何实现自动加载类内容提出宝贵意见

微信扫一扫

易采站长站微信账号