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设计模式  Command(命令模式)
Jun 17 PHP
php木马webshell扫描器代码
Jan 25 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
May 29 PHP
PHP中变量引用与变量销毁机制分析
Nov 15 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
yii2简单使用less代替css示例
Mar 10 PHP
PHP PDOStatement::fetchAll讲解
Jan 31 PHP
PHP crypt()函数的用法讲解
Feb 15 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php命令行模式代码实例详解
Feb 26 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字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
vue组件tabbar使用方法详解
2018/11/06 Javascript
python实现类的静态变量用法实例
2015/05/08 Python
python简单实现刷新智联简历
2016/03/30 Python
Python检测网络延迟的代码
2018/05/15 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
Python 获取项目根路径的代码
2019/09/27 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
有机童装:Toby Tiger
2018/05/23 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
电大物流学生的自我评价
2013/10/25 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
建党伟业电影观后感
2015/06/01 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书