Laravel如何实现自动加载类


Posted in PHP onOctober 14, 2019

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

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 相关文章推荐
批量获取memcache值并按key的顺序返回的实现代码
Jun 14 PHP
解析php中static,const与define的使用区别
Jun 18 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
Nov 12 PHP
浅析php工厂模式
Nov 25 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
PHP获取photoshop写入图片文字信息的方法
Mar 31 PHP
详解PHP中的null合并运算符
Dec 30 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
解决laravel资源加载路径设置的问题
Oct 14 #PHP
Laravel基础_关于view共享数据的示例讲解
Oct 14 #PHP
在Laravel 的 Blade 模版中实现定义变量
Oct 14 #PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 #PHP
Laravel实现ApiToken认证请求
Oct 14 #PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 14 #PHP
Laravel 自动生成验证的实例讲解:login / logout
Oct 14 #PHP
You might like
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
javascript优先加载笔记代码
2008/09/30 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
vue实现信息管理系统
2020/05/30 Javascript
python实现稀疏矩阵示例代码
2017/06/09 Python
python编程羊车门问题代码示例
2017/10/25 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
Python使用贪婪算法解决问题
2019/10/22 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
工业设计专业推荐信
2013/10/29 职场文书
求职自荐书范文
2013/12/04 职场文书
买房委托公证书
2014/04/08 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
学校施工安全责任书
2015/01/29 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
经典爱情感言
2015/08/03 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
教你怎么用python实现字符串转日期
2021/05/24 Python