简介

分享composer和自动加载相关介绍

概念

  • composer:是PHP用来管理依赖(dependency)关系的工具
  • 对于现代语言而言,包管理器基本上是标配。例:java有maven,python有pip,ruby有gem,nodejs有npm,go有modules,php则有pear。但使用起来麻烦,相关中文资料较少。则衍生出composer
  1. 创始人jordi boggiano
  2. 创建于2011年4月,直到2016年4月才发布正式版

作者简介

安装

  1. linux下 curl -sS https://getcomposer.org/installer | php (全局安装)
  2. windows下,下载exe文件,一键安装即可(全局安装)
  3. 局部安装。只下载composer.phar文件,调用php命令执行(需要注意php版本需大于5.3,已安装openssl扩展才能正常使用)
  4. 检测是否安装成功,命令行输入composer或php composer.phar来检测是否安装成功

安装依赖运行过程

常用命令

  1. composer install 安装命令(读取composer.json,安装到vendor目录)
  2. composer require [package_name] 申明依赖(安装或者更新依赖)
  3. composer create-project [project_name] 在目录下创建一个新项目(相当于git clone和svn checkout)
  4. composer update [package_name] 更新当前目录指定包或者更新所有依赖的包
  5. composer remove [package_name] 移除指定包的依赖
  6. composer search [package_name] 搜索相关包信息
  7. composer config [options] 更改配置(最常用是修改读取的源,使用国内镜像composer config -g repo.packagist composer https://packagist.phpcomposer.com
  8. composer self-update 更新当前composer版本
  9. composer init 初始化创建一个composer.json文件

类库包的依赖定义

类库包的依赖定义

项目包的依赖定义

类库包的依赖定义

php包的脚本事件

  • composer在运行阶段会触发一下事件:
事件名称 说明 事件名称 说明
pre-install-cmd 在install命令执行前触发 pre-package-install 在资源包安装前触发
post-install-cmd 在install命令执行后触发 post-package-install 在资源包安装后触发
pre-update-cmd 在update命令执行前触发 pre-package-update 在资源包更新前触发
post-update-cmd 在update命令执行后触发 post-package-update 在资源包更新后触发
pre=status-cmd 在status命令执行前触发 pre-package-uninstall 在资源包被卸载前触发
post-status-cmd 在status命令执行后触发 post-package-uninstall 在资源包被卸载后触发

应用场景

  1. 主流的php框架都默认使用composer来管理类库,例如:laravel、yii2、thinkphp、ci3.1版本也可以配置composer,但默认是关闭的。
  2. 如果框架默认没有配置项,也可以手动安装composer到框架;

自研框架使用composer管理类库

使用技巧

  • 在github上看到一个类库很好用,又懒得查是否有上传到composer,可以看该类库下面是否有composer.json文件。点击进去就可以看到对应的包名和详细信息
  • 当你不想依赖任何类库时,只想看看composer自动加载的源码实现方式,可以手动在项目目录编写composer.json(只写一个空对象)再执行install命令,composer则会自动生成依赖的相关代码文件
  • 当你觉得composer require类库很慢的时候,可以使用config命令,全局配置使用国内镜像来下载依赖 composer config -g repo.packagist composer https://packagist.phpcomposer.com
  • 执行update命令可以批量更新当前所有类库(不带参数),也可以单独更新某个类库,但是如果是指定版本号(写死了)创建的依赖是无法更新的,需要了解包版本的配置。
  • 如果你编辑了composer.json,你应该会看到这样的信息。比如如果你增加或更新了细节信息,如:库的描述、作者等参数,甚至仅仅增加了一个空格,都会改变文件的MD5sum、然后composer就会警告哈希值与composer.lock中记载的不同
warning: The lock file is not up to date with the latest changes in composer.json, you may be getting outdated dependencies, run update to update them.
  • 在部署代码到生产环境的时候,别忘了优化一下自动加载:composer dump-autoload --optimize 安装包的时候可以同样使用 --optimize-autoloader,不加这一项你可能会发现有20%到25%的性能损失
  • 你可能会觉得每安装一个库都需要修改composer.json太麻烦,那么你可以直接使用require命令 composer require "foo/bar:1.0.0"

包版本

  • 我们从composer下面安装的包都是有版本的,创建依赖时不指定包名,默认安装最新的稳定发行版本
名称 实例 描述
确切的版本号 1.0.2 你可以指定包的确切版本
范围 >=1.0 或 >=1.0,<2.0 或 >=1.0,<1.1|>=1.2 通过使用比较操作符可以指定有效的版本范围。有效的操作符:>、>=、<、<=、!=。你可以定义多个范围,用逗号隔开,这将被视为一个逻辑and处理,一个管道符号|将作为逻辑or处理。and的优先级高于or
通配符 1.0.* 你可以使用通配符*来指定一种模式。1.0.*与>=1.0,<1.1是等效的。
赋值操作符~ ~1.2 这对于遵循语义化版本号的项目非常有用。~1.2相当于>=1.2,<2.0。
赋值操作符^ ^1.2.3 ^1.2.3相当于>=1.2.3,<2.0.0。

自动加载

  1. 什么是自动加载?
  • 当加载php类时,如果类所在文件没有被包含进来,或者类名出错,zend引擎会自动调用__autoload函数
  • spl_autoload_register() 可以注册一个自己的函数作为__autoload()的实现
  1. 在composer自带的autoload出现之前,类库的加载方式?
  • 需要什么就require进来
  • 自己写__autoload()加载类库

自定义自动加载函数

composer自动加载机制

  1. 每一个可以使用composer安装的类库,都必须包含一个composer.json文件。(包含描述,依赖,路径和命名空间的映射关系)
  2. 使用composer安装类库之后,都会在自己的目录(项目/vendor/composer/下)生成或更新install.json文件(是各个类库composer.json信息的集合)、同时生成命名空间或文件路径映射。
  3. 应用spl_autoload_register等函数,结合require来按需加载要使用的类库

PSR规范

注:使用composer自动加载的类需要满足PSR-0或PSR-4的规范,也兼容路径映射。 Framework Interoperability Group(框架可互用性小组),简称FIG,成立于2009年。FIG最初由几位知名php框架开发者发起,在吸纳了许多优秀的大脑和强健的体魄后,提出了PSR-0到PSR-4五套php非官方规范(如今已更新到PSR-18了~~~)

  1. PSR-0(Autoloading Standard)自动加载标准(2014/10/21日被明确宣布废除)
  2. PSR-1(Basic Coding Standard)基础编码标准
  3. PSR-2(Coding Style Guide)编码风格向导
  4. PSR-3(Logger Interface)日志接口规范
  5. PSR-4(Improved Autoloading)自动加载优化标准

PSR-0和PSR-4的区别

查看更多规范

使用composer安装自己的包

  1. 每一个项目都是一个包。在一个项目目录里面创建一个composer.json的文件,那么这个目录就是一个包
  2. 在composer.json文件中定义自己的项目名、说明、版本号、依赖等等参数
  3. 发布到VSC(线上版本控制系统,如git,svn)
  4. 发布到packagist https://packagist.org/ (注册-发布-收录)
  5. 发布成功后,等待一会(国内镜像是一定时间同步一次)就可以在本地使用composer命令下载自己的包了