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 相关文章推荐
3
Oct 09 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
Apr 24 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
推荐几个开源的微信开发项目
Dec 28 PHP
thinkPHP学习笔记之安装配置篇
Mar 05 PHP
php获取英文姓名首字母的方法
Jul 13 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
thinkPHP线上自动加载异常与修复方法实例分析
Dec 01 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 05 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
php将xml转化对象的实例详解
Nov 17 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在特殊字符前加斜杠的实现代码
2011/07/17 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
django-初始配置(纯手写)详解
2019/07/30 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
python numpy实现rolling滚动案例
2020/06/08 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
英文商务邀请信
2014/01/22 职场文书
人民教师的自我评价分享
2014/02/21 职场文书
消防宣传口号
2014/06/16 职场文书
综合办公室岗位职责
2015/04/11 职场文书
开学典礼观后感
2015/06/15 职场文书
趣味运动会标语口号
2015/12/26 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python