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.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
php+mysql写的简单留言本实例代码
Jul 25 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
PHP解决中文乱码
Apr 28 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 PHP
PHP中cookie知识点学习
May 06 PHP
laravel数据库查询结果自动转数组修改实例
Feb 27 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如何将日志写进syslog
2013/06/28 PHP
PHP安全上传图片的方法
2015/03/21 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
jquery中动态效果小结
2010/12/16 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
轻松理解JavaScript闭包
2017/03/14 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
python数据结构学习之实现线性表的顺序
2018/09/28 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
如何强制垃圾回收
2015/10/06 面试题
函授本科个人自我鉴定
2014/03/25 职场文书
国旗下的演讲稿
2014/05/08 职场文书
医院标语大全
2014/06/23 职场文书
申报材料格式
2014/12/30 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
中学生运动会广播稿
2015/08/19 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
Redis Stream类型的使用详解
2021/11/11 Redis