第4章 探究 Composer 加载原理

2023年 9月 12日 17.4k 0

4.1 Composer 介绍与应用

composer.png

1. 什么是 Composer ?

Composer 是一个依赖的包管理工具, 会在每个项目的基础上进行依赖包的管理,在你项目中的某个目录 ( 例如 vendor ) 进行安装。默认情况下它不会全局安装任何东西。

如果没有包管理器会怎样?

当开发中需要一个组件包时,这时候你就需要下载引入它,如果使用的组件包又需要另外一个包的话,你又不得不继续下载包,而且它们之间依赖的环境条件你还需要自己去进行解决。但如果有了包管理器,开发需要使用的包或者包与包之间的依赖关系,都完全可以交给包管理器来统一管理之间的依赖关系。

2. 如何使用?

Linux 下载安装 Composer

$ curl -s https://getcomposer.org/installer | php  
$ sudo mv composer.phar /usr/local/bin/composer  

Windows 下载安装

Wondows 平台上,我们只需要下载 Composer-Setup.exe 后,一步步安装即可。需要注意的是,你需要开启 openssl 配置,我们打开 php 目录下的 php.ini,将 extension=php_openssl.dll 前面的分号去掉就可以了。

安装好后,在更改镜像为阿里云 Composer 全量镜像

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
取消配置:composer config -g --unset repos.packagist

4.2 PHP 自动加载原理

1. 为啥需要自动加载?

例如,现在有 A.php和 B.php,如果现在我A需要用到 B.php 里面的方法,就需要把 B.php 加载到 A.php 里面来,这样我 A 才能使用到方法。

何来自动加载?就是当一个 PHP 文件实例化一个类文件,但实例化的文件本身不存在,就需要通过自动加载的方式把不存在的文件给引入到当前类库中,然后才能进行方法调用的执行。相当于有一个备选的方案来帮助引入 PHP 类文件。

2. PHP 要怎么实现自动加载呢?

首先 PHP 在实例化一个不存在的类库时,就会触发到 spl_autoload_register 注册的闭包方法,在这个函数的方法体里面进行方法引入。那为啥能准备的引入文件呢 ?

因为当实例化的文件不存在时,这个类的名字会通过参数传到闭包函数中,闭包函数的方法体在根据参数直接来引入相关类,这样就可以实例化到相关的文件,然后就可以进行正常的操作。

spl_autoload_register(function($className){
  if (is_file('./lib/' .$className.'.php')) {
    require './lib/' . $className.'.php';
  }
});

其实在 spl_autoload_register 之前,还有一个 __autoload 的魔术方法来进行类库的自动引入,只不过该方法在一个类文件中只能引用一次,所以当多个文件需要引入时,就不太方便。故次才有了spl_autoload_register 的方法。

4.3 解析 Composer 加载过程

Composer 的加载是通过 PSR 的编码规范来进行自动加载的。 PSR-4 规范了如何指定文件路径从而自动加载类的定义。

一个完整的类名需具有以下结构 :


  • 完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace"。
  • 完整的类名可以有一个或多个子命名空间。
  • 完整的类名必须有一个最终的类名。
  • 完整的类名中任意一部分中的下滑线都是没有特殊含义的。
  • 完整的类名可以由任意大小写字母组成。
  • 所有类名都必须是大小写敏感的。

示例 :

PSR-4 风格

  • 类名:Nahida
  • 命名空间前缀:Zend
  • 文件基目录:/usr/includes/Zend/
  • 文件路径:/usr/includes/Zend/Nahida.php

类名:Request

  • 命名空间前缀:SymfonyCore
  • 文件基目录:./vendor/Symfony/Core/
  • 文件路径:./vendor/Symfony/Core/Request.php

目录结构 :

-vendor/
| -vendor_name/
| | -package_name/
| | | -src/
| | | | -ClassName.php       # Vendor_NamePackage_NameClassName
| | | -tests/
| | | | -ClassNameTest.php   # Vendor_NamePackage_NameClassNameTest

class的类文件需要存放到 vendor 当中去,不然就会引入失败。

按照规范定义了类库后。Composer 会做如下操作 :

  • 你有一个项目依赖于若干个库。
  • 其中一些库依赖于其他库。
  • 你声明你所依赖的东西。
  • Composer 会找出那个版本的包需要安装,并安装它们(将它们下载到你的项目中)

比如:项目需要使用 phpunit 组件

{
   "require": {
     "phpunit/phpunit":"~6.0",
   }
 }

然后在 composer require 之后我们只要在项目里面直接 use phpunit 的类即可使用。

执行 composer require 时发生了什么 ?

  • Composer 会找到符合 PR4 规范的第三方库的源
  • 将其加载到 vendor 目录下
  • 初始化顶级域名的映射并写入到指定的文件里

( 如:'PHPUnitFrameworkAssert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php'

  • 写好一个 autoload 函数,并且注册到 spl_autoload_register( ) 里

4.4 探索 Composer 源码

很多框架在初始化的时候都会引入 Composer 来协助自动加载,以 Laravel 为例,它入口文件 index.php 第一句就是利用 Composer 来实现自动加载功能。

1. 启动框架

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论