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 相关文章推荐
第四节--构造函数和析构函数
Nov 16 PHP
PHP stream_context_create()作用和用法分析
Mar 29 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
Nov 17 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
php 数组随机取值的简单实例
May 23 PHP
php微信高级接口群发 多客服
Jun 23 PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 PHP
PHP请求远程地址设置超时时间的解决方法
Oct 29 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 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
无线电的诞生过程
2021/03/01 无线电
JAVA/JSP学习系列之二
2006/10/09 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
HTML代码中标签的全部属性 中文注释说明
2009/03/26 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
详解Vue之计算属性
2020/06/20 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python模拟用户登录验证
2017/09/11 Python
python和opencv实现抠图
2018/07/18 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
python空元组在all中返回结果详解
2020/12/15 Python
如何开发一个JQuery插件
2016/07/28 面试题
年度考核自我鉴定
2013/11/09 职场文书
小学门卫岗位职责
2013/12/17 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
车间机修工岗位职责
2014/02/28 职场文书
环保公益广告语
2014/03/13 职场文书
保密承诺书
2014/03/27 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
质量保证书格式
2015/02/27 职场文书