composer 引入扩展解析
PSR 规范
PHP FIG
PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。
PHP FIG,FIG 是 Framework Interoperability Group(框架可互用性小组)的缩写,由几位开源框架的开发者成立于 2009 年,从那开始也选取了很多其他成员进来(包括但不限于 Laravel, Joomla, Drupal, Composer, Phalcon, Slim, Symfony, Zend Framework 等),虽然不是「官方」组织,但也代表了大部分的 PHP 社区。
项目的目的在于:通过框架作者或者框架的代表之间讨论,以最低程度的限制,制定一个协作标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了 PHP 的发展,解决这个程序设计师由来已久的困扰。
目前已表决通过了不少套标准,已经得到大部分 PHP 框架的支持和认可。
本项目的主要面向对象是所有参与的各个成员(也就是各自框架的社区),这里是完整的 成员列表,当然,同时也欢迎其它 PHP 社区采用本规范。
- 统一编码规范,减少学习成本。
PSR-0 自动加载标准(已废弃,一些旧的第三方库还有在使用)
PSR-1 基础编码标准PSR-2 编码风格向导
PSR-3 日志接口
PSR-4 自动加载的增强版,替换掉了 PSR-0
PSR-6 缓存接口规范
PSR-7 HTTP 消息接口规范
具体详细的规范标准可以查看 PHP 标准规范
PSR-4 自动加载规范
- 术语「class」指的是类(classes)、接口(interfaces)、特征(traits)和其他类似的结构。
- 全限定类名具有以下形式:
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
- 完全合格的类名称必须具有顶级名称空间名称,也称为"vendor namespace"。
- 完全合格的类名称可以具有一个或多个子命名空间名称。
- 完全合格的类名称必须具有终止类名称。
- 下划线在完全限定的类名的任何部分中没有特殊含义。
- 完全限定的类名中的字母字符可以是小写和大写的任意组合。
- 所有类名必须以区分大小写的方式引用。
- 全限定类名的加载过程
- 在全限定的类名(一个「命名空间前缀」)中,一个或多个前导命名空间和子命名空间组成的连续命名空间,不包括前导命名空间的分隔符,至少对应一个「根目录」。
- 「命名空间前缀」后面的相邻子命名空间与根目录下的目录名称相对应(且必须区分大小写),其中命名空间的分隔符表示目录分隔符。
- 最终的类名与以
.php
结尾的文件名保持一致,这个文件的名字必须和最终的类名相匹配(意思就是如果类名是FooController
,那么这个类所在的文件名必须是FooController.php
)。
- 自动加载文件禁止抛出异常,禁止出现任何级别的错误,也不建议有返回值。
composer.json 中的 autoload
ps
r一种规范 在项目中compose
r 怎样才能加载到文件,关键的原因是 composer.json
文件中的autoload
来定义使用的规范和目录.
composer.json
目前支持 psr-4
psr-0
files
classmap
PSR-4
在 install/update
过程中,所有PSR-4
引用都合并到一个键=>值数组中,储存在vendor / composer / autoload_psr4.php
。
{
"autoload": {
"psr-4": {
"Monolog\\": "src/",
"Vendor\\Namespace\\": ""
}
}
}
{
"autoload": {
"psr-4": { "Monolog\\": ["src/", "lib/"] }
}
}
{
"autoload": {
"psr-4": { "": "src/" }
}
}
PSR-0
在 install/update
过程中,所有PSR-0
引用都结合为一个单一的键值对数组,存储至vendor/composer/autoload_namespaces.php
中。
{
"autoload": {
"psr-0": {
"Monolog\\": "src/",
"Vendor\\Namespace\\": "src/",
"Vendor_Namespace_": "src/"
}
}
}
Classmap
classmap
引用的所有组合,都会在 install/update
过程中生成,并存储到vendor/composer/autoload_classmap.php
文件中
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
Files
如果你想要明确的指定,在每次请求时都要载入某些文件,那么你可以使用 ‘files’ autoloading。通常作为函数库的载入方式(而非类库)。
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}
更多详情查看 composer.json 架构
执行 composer require 时发生了什么?
- composer 会找到符合 PR4 规范的第三方库的源
- 将其加载到 vendor 目录下
- 初始化顶级域名的映射并写入到指定的文件里