目录
您可能感兴趣的文章:
首页 后端开发 php教程 Laravel框架中composer自动加载的实现详解

Laravel框架中composer自动加载的实现详解

Jul 06, 2018 pm 05:48 PM
composer laravel laravel框架 php 自动加载

Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点。下面这篇文章主要给大家介绍了关于Laravel框架中composer自动加载实现的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。

基础

自动加载允许你通过即用即加载的方式来加载需要的类文件,而不用每次都写繁琐的require 和include语句。因此,每一次请求的执行过程都只加载必须的类,也不不要关心类的加载问题,只要需要的时候直接使用即可。

laravel 框架是通过composer 实现的自动加载。

是通过  下面的代码实现的。

require_once __DIR__ . '/composer' . '/autoload_real.php';
return ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f::getLoader();
登录后复制

首先我们对spl_autoload_register和spl_autoload_unregister 这两个函数进行解释一下。

spl_autoload_register 自动注册 一个或多个 自动加载函数,这些函数一般在 实例化类的时候,自动运行。

spl_autoload_unregister 恰恰相反。

贴上我实验的代码:

这是autoload.php

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/12/7
 * Time: 14:10
 */
namespace app;
class Autoload {

 public function __construct()
 {
  $this->autoload();
 }
 public function autoload(){
  // spl_autoload_register(array(&#39;Autoload&#39;,&#39;ss&#39;),true); 会触发致命错误,必须带上命名空间
  spl_autoload_register(array(&#39;app\Autoload&#39;,&#39;ss&#39;),true);
 }
 public function ss(){
  echo 666;
  exit;
 }
}
登录后复制

这是index.php

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/12/7
 * Time: 14:10
 */
require &#39;autoload.php&#39;;
$autoload=new \app\Autoload();
$b=new B();// 此时自动运行自动加载函数
echo 77;
exit;
登录后复制

找到getLoader 这个函数,并对其进行分析:

 public static function getLoader()
 {
  if (null !== self::$loader) {
   return self::$loader;
  }
  //注册自动加载函数,在加载或实例化类,运行loadClassLoader函数
  spl_autoload_register(array(&#39;ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f&#39;, &#39;loadClassLoader&#39;), true, true);
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
  spl_autoload_unregister(array(&#39;ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f&#39;, &#39;loadClassLoader&#39;));
/********************1********************************************************
  $map = require __DIR__ . &#39;/autoload_namespaces.php&#39;;
  foreach ($map as $namespace => $path) {
   $loader->set($namespace, $path);
  }
  $map = require __DIR__ . &#39;/autoload_psr4.php&#39;;
  foreach ($map as $namespace => $path) {
   $loader->setPsr4($namespace, $path);
  }
  $classMap = require __DIR__ . &#39;/autoload_classmap.php&#39;;
  if ($classMap) {
   $loader->addClassMap($classMap);
  }
/********************1********************************************************
  $loader->register(true);  $includeFiles = require __DIR__ . &#39;/autoload_files.php&#39;;  foreach ($includeFiles as $fileIdentifier => $file) {   composerRequire7b20e4d61e2f88170fbbc44c70d38a1f($fileIdentifier, $file);  }  return $loader; }}
登录后复制

/***** 包围的部分,主要对ClassLoader 中的

$prefixesPsr0 、$prefixDirsPsr4 、$classMap 等属性进行赋值。即加载一些配置好的文件,在后面进行加载或寻找文件时候,就是从加载的配置文件中寻找。寻找要加载的类主要通过register 函数来实现。然后分析register函数。

public function register($prepend = false)
{
 spl_autoload_register(array($this, &#39;loadClass&#39;), true, $prepend);
}
登录后复制

发现实际将该类中loadClass 函数注册为自动加载函数。于是开始分析loadClass函数,最终是通过findFile进行类的寻找。

public function findFile($class)
{
/// 特别注意 参数$class 是根据命名空间生成的class名称,具体请参考命名空间特性。
 // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
 if (&#39;\\&#39; == $class[0]) {
  $class = substr($class, 1);
 }
 // class map lookup 首先从加载的classMap 中寻找
 if (isset($this->classMap[$class])) {
  return $this->classMap[$class];
 }
 if ($this->classMapAuthoritative) {
  return false;
 }
// 从刚才加载的配置文件中寻找文件。先按照 psr4 规则寻找,再按照psr0 寻找
// 两种规则的不同主要是对下划线的处理方式。
 $file = $this->findFileWithExtension($class, &#39;.php&#39;);
 // Search for Hack files if we are running on HHVM
 if ($file === null && defined(&#39;HHVM_VERSION&#39;)) {
  $file = $this->findFileWithExtension($class, &#39;.hh&#39;);
 }
 if ($file === null) {
  // Remember that this class does not exist.
  return $this->classMap[$class] = false;
 }
 return $file;
}
登录后复制

至此register函数分析完。我们接着分析getLoader函数剩余代码。

$includeFiles = require __DIR__ . &#39;/autoload_files.php&#39;;
foreach ($includeFiles as $fileIdentifier => $file) {
 composerRequire7b20e4d61e2f88170fbbc44c70d38a1f($fileIdentifier, $file);
}
登录后复制

这段代码其实就是加载autoload_file.php 文件。

总结

您可能感兴趣的文章:

PHP服务端环境搭建的图文教程

php实现希尔排序算法的方法讲解

PHP使用自定义key实现对数据加密解密的方法讲解

以上是Laravel框架中composer自动加载的实现详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

laravel入门实例 laravel入门实例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

使用 Composer 解决推荐系统的困境:andres-montanez/recommendations-bundle 的实践 使用 Composer 解决推荐系统的困境:andres-montanez/recommendations-bundle 的实践 Apr 18, 2025 am 11:48 AM

在开发一个电商网站时,我遇到了一个棘手的问题:如何为用户提供个性化的商品推荐。最初,我尝试了一些简单的推荐算法,但效果并不理想,用户的满意度也因此受到影响。为了提升推荐系统的精度和效率,我决定采用更专业的解决方案。最终,我通过Composer安装了andres-montanez/recommendations-bundle,这不仅解决了我的问题,还大大提升了推荐系统的性能。可以通过一下地址学习composer:学习地址

laravel用户登录功能 laravel用户登录功能 Apr 18, 2025 pm 12:48 PM

Laravel 提供了一个全面的 Auth 框架,用于实现用户登录功能,包括:定义用户模型(Eloquent 模型)创建登录表单(Blade 模板引擎)编写登录控制器(继承 Auth\LoginController)验证登录请求(Auth::attempt)登录成功后重定向(redirect)考虑安全因素:哈希密码、防 CSRF 保护、速率限制和安全标头。此外,Auth 框架还提供重置密码、注册和验证电子邮件等功能。详情请参阅 Laravel 文档:https://laravel.com/doc

如何使用 Composer 简化邮件营销:DUWA.io 的应用实践 如何使用 Composer 简化邮件营销:DUWA.io 的应用实践 Apr 18, 2025 am 11:27 AM

在进行邮件营销活动时,我遇到了一个棘手的问题:如何高效地创建并发送HTML格式的邮件。传统的方法是手动编写代码并使用SMTP服务器发送邮件,但这不仅耗时,而且容易出错。在尝试了多种解决方案后,我发现了DUWA.io,这是一个简单易用的RESTAPI,能够帮助我快速创建和发送HTML邮件。为了进一步简化开发流程,我决定使用Composer来安装和管理DUWA.io的PHP库——captaindoe/duwa。

laravel框架技巧分享 laravel框架技巧分享 Apr 18, 2025 pm 01:12 PM

在这个技术不断进步的时代,掌握先进的框架对于现代程序员至关重要。本文将通过分享 Laravel 框架中鲜为人知的技巧,帮助你提升开发技能。Laravel 以其优雅的语法和广泛的功能而闻名,本文将深入探讨其强大的特性,提供实用技巧和窍门,帮助你打造高效且维护性高的 Web 应用程序。

laravel6实战视频 laravel6实战视频 Apr 18, 2025 pm 12:36 PM

想要学习 Laravel 6 实战,可从 Laracasts(推荐)、官方文档和 YouTube 获取视频教程。推荐课程包括 Laracasts 的“Laravel 6 从入门到精通”和官方团队制作的“Official Laravel 6 Tutorial”。在选择视频课程时,要考虑技能水平、授课风格、项目经验和更新频率。

Laravel如何学习 怎么免费学习Laravel Laravel如何学习 怎么免费学习Laravel Apr 18, 2025 pm 12:51 PM

想要学习 Laravel 框架,但苦于没有资源或经济压力?本文为你提供了免费学习 Laravel 的途径,教你如何利用网络平台、文档和社区论坛等资源,从入门到掌握,为你的 PHP 开发之旅奠定坚实基础。

提升 Doctrine 实体序列化效率:sidus/doctrine-serializer-bundle 的应用 提升 Doctrine 实体序列化效率:sidus/doctrine-serializer-bundle 的应用 Apr 18, 2025 am 11:42 AM

在处理一个包含大量Doctrine实体的项目时,我遇到了一个棘手的问题:每次序列化和反序列化实体时,性能变得非常低效,导致系统响应时间显着增加。我尝试了多种优化方法,但效果不佳。幸运的是,通过使用sidus/doctrine-serializer-bundle,我成功地解决了这个问题,显着提升了项目的性能。

See all articles