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 相关文章推荐
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
May 10 PHP
PHP include_path设置技巧分享
Jul 03 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 PHP
php curl_init函数用法
Jan 31 PHP
destoon后台网站设置变成空白的解决方法
Jun 21 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
PHP调试的强悍利器之PHPDBG
Feb 22 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
php curl优化下载微信头像的方法总结
Sep 07 PHP
Laravel 前端资源配置教程
Oct 18 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实现网上点歌(二)
2006/10/09 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python获取本机mac地址和ip地址的方法
2015/04/29 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
Python中创建二维数组
2018/10/17 Python
tensorflow 查看梯度方式
2020/02/04 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
什么是继承
2013/12/07 面试题
法学研究生自我鉴定范文
2013/12/04 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
地球上的星星观后感
2015/06/02 职场文书
公司老总年会致辞
2015/07/30 职场文书
Python 如何安装Selenium
2021/05/06 Python
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL