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 session常见问题集锦及解决办法总结
Mar 18 PHP
PHP+MySQL 手工注入语句大全 推荐
Oct 30 PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
PHP 函数学习简单小结
Jul 08 PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 PHP
zf框架的数据库追踪器使用示例
Mar 13 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
详解WordPress开发中get_header()获取头部函数的用法
Jan 08 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
Mar 20 PHP
PHP框架性能测试报告
May 08 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 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
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
Linux下多个Python版本安装教程
2018/08/15 Python
python 重命名轴索引的方法
2018/11/10 Python
Python分支语句与循环语句应用实例分析
2019/05/07 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
某公司部分笔试题
2013/11/05 面试题
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
历史教育专业个人求职信
2013/12/13 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
个人授权委托书范本
2014/04/03 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
党支部书记四风问题整改措施
2014/09/24 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
初中班干部工作总结
2015/08/10 职场文书
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python
create-react-app开发常用配置教程
2022/06/25 Javascript