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 相关文章推荐
php Sql Server连接失败问题及解决办法
Aug 07 PHP
php foreach、while性能比较
Oct 15 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
PHPMYADMIN导入数据最大为2M的解决方法
Apr 23 PHP
用PHP代码在网页上生成图片
Jul 01 PHP
PHP实现linux命令tail -f
Feb 22 PHP
php实现搜索类封装示例
Mar 31 PHP
使用Codeigniter重写insert的方法(推荐)
Mar 23 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
PHP树形结构tree类用法示例
Feb 01 PHP
YII框架http缓存操作示例
Apr 29 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 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 显示指定路径下的图片
2009/10/29 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
php构造函数的继承方法
2015/02/09 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
javascript 定义新对象方法
2010/02/20 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
python安装Scrapy图文教程
2017/08/14 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
了解一下python内建模块collections
2020/09/07 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
什么是servlet链?
2014/07/13 面试题
幼儿园长自我鉴定
2013/10/17 职场文书
银行简历自我评价
2014/02/11 职场文书
法制演讲稿
2014/09/10 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
绵山导游词
2015/02/05 职场文书
复兴之路展览观后感
2015/06/02 职场文书
2016党员入党决心书
2015/09/22 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python