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一些服务器端特性的配置加强php的安全
Oct 09 PHP
将PHP作为Shell脚本语言使用
Oct 09 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
Jun 26 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
PHP制作登录异常ip检测功能的实例代码
Nov 16 PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
Jun 05 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 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 模拟$_PUT实现代码
2010/03/15 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
javascript 精粹笔记
2010/05/09 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
python字符串连接的N种方式总结
2014/09/17 Python
Python解析最简单的验证码
2016/01/07 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers