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原创论坛
Oct 09 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
phpmyadmin 3.4 空密码登录的实现方法
May 29 PHP
解析php中var_dump,var_export,print_r三个函数的区别
Jun 21 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
php中Array2xml类实现数组转化成XML实例
Dec 08 PHP
php数组函数array_walk用法示例
May 26 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 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 skymvc 一款轻量、简单的php
2011/06/28 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
javascript中Object使用详解
2015/01/26 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
Vue中props的详解
2019/05/16 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
跟老齐学Python之类的细节
2014/10/13 Python
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
python+opencv实现车道线检测
2021/02/19 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
Linux常见面试题
2013/03/18 面试题
煤矿班组长岗位职责
2013/12/29 职场文书
护理专科毕业生自荐书范文
2014/02/19 职场文书
法人授权委托书范本
2014/04/04 职场文书
局火灾防控工作方案
2014/05/25 职场文书
前台接待岗位职责
2015/02/03 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
Python中requests库的用法详解
2022/06/05 Python