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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
PHP+MYSQL的文章管理系统(二)
Oct 09 PHP
几个学习PHP的网址
Nov 25 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
php+highchats生成动态统计图
May 21 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
PHP中使用break跳出多重循环代码实例
Jan 21 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 PHP
laravel-admin的图片删除实例
Sep 30 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
电脑硬件及电脑配置知识大全
2020/03/17 数码科技
VFP与其他应用程序的集成
2006/10/09 PHP
操作Oracle的php类
2006/10/09 PHP
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php addslashes 函数详细分析说明
2009/06/23 PHP
一个PHP数组应该有多大的分析
2009/07/30 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
英国大码女性时装零售商:Evans
2018/08/29 全球购物
巴西最大的珠宝连锁店:Vivara
2019/04/18 全球购物
电焊工工作岗位职责
2014/02/06 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
化工生产实习心得体会
2016/01/22 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
python中%格式表达式实例用法
2021/06/18 Python
PyTorch中的torch.cat简单介绍
2022/03/17 Python