4.1 Composer 介绍与应用
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. 启动框架