当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel如何实现自动加载类

发布:smiling 来源: PHP粉丝网  添加日期:2022-01-04 19:39:41 浏览: 评论:0 

今天小编就为大家整理了一篇Laravel如何实现自动加载类的问题,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

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

Laravel如何实现自动加载类

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

首先看 vendor/autoload.php文件

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

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

看一下部分代码

  1. if (null !== self::$loader) { 
  2.  return self::$loader
  3.  
  4. spl_autoload_register(array('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3''loadClassLoader'), true, true); 
  5. self::$loader = $loader = new \Composer\Autoload\ClassLoader(); 
  6. spl_autoload_unregister(array('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3''loadClassLoader')); 

这里自动加载了当前类的loadClassLoader静态方法,该方法加载了__DIR__ . '/ClassLoader.php'文件,该文件中的类起到了整个框架类自动加载的作用。

回到autoload_real.php文件的getLoader()方法,看剩下部分代码:

  1. $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); 
  2.   if ($useStaticLoader) { 
  3.    require_once __DIR__ . '/autoload_static.php'
  4.  
  5.    call_user_func(\Composer\Autoload\ComposerStaticInit5586036d8fdd45ae351f9a5ae924a5a3::getInitializer($loader)); 
  6.   } else { 
  7.    $map = require __DIR__ . '/autoload_namespaces.php'
  8.    foreach ($map as $namespace => $path) { 
  9.     $loader->set($namespace$path); 
  10.    } 
  11.  
  12.    $map = require __DIR__ . '/autoload_psr4.php'
  13.    foreach ($map as $namespace => $path) { 
  14.     $loader->setPsr4($namespace$path); 
  15.    } 
  16.  
  17.    $classMap = require __DIR__ . '/autoload_classmap.php'
  18.    if ($classMap) { 
  19.     $loader->addClassMap($classMap); 
  20.    } 
  21.   } 

这里主要加载一些自动加载类相关的资源。

随后调用$loader->register(true);

这个方法比较重要

  1. public function register($prepend = false) 
  2.  spl_autoload_register(array($this'loadClass'), true, $prepend); 

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

查看loadClass方法

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

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

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

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

Tags: Laravel自动加载类

分享到: