刘懿东
php推荐标准(PSR)
背景
php组件和框架的数量很多,多得让人难以置信。现代的php生态系统是个名副其实的大熔炉,有各种各样的代码,帮助我们开发者构建强大的应用
但是,旧的php框架是单独开发出来的,不能与其他php框架共享代码。
如果你的项目使用某个旧的php框架,就被束缚在这个框架的生态系统了
PHP-FIG
多位php框架开发者在2009年的phptek上谈论了这个问题。他们讨论了如何改进框架内的通信,这几位php框架开发者后来组建了PHP Framework Interop Group(简称PHP-FIG)。他们制定了推荐规范,php框架可以自愿实现这些规范,改进与其他框架的通信和共享功能。
PHP-FIG是框架代表自发组织的,其成员不是选举产生的。PHP-FIG制定推荐规范,PHP框架自愿实现这些规范,改进与其他框架的通信和共享功能,很多最受欢迎的PHP框架都会实现定案的规范
框架的互操作性
含义:通过接口、自动加载机制和标准的风格,让框架相互合作
接口
php框架之间通过共用的接口合作。框架通过php接口假定第三方依赖提供了什么方法,而不关心依赖是如何实现接口的
假如第三方日志记录器对象实现了emergency、alert、critical、error、warning、notice、info和debug方法,那么框架就可放心使用这个记录器对象
php开发者使用接口可以开发、共享并使用专门的组件,而无需使用庞大的框架
自动加载机制
多数现代的php组件和框架都符合同一个自动加载机制标准。这意味着只需要使用一个自动加载器就能混合搭配多个php组件
风格
标准的代码风格对我们的项目也有好处,使用标准的代码,不管作者是谁,团队中的所有成员都胡立即理解代码
PSR
PSR是PHP Standards Recommendation(PHP推荐标准)简称,PSR-1、PSR-2、PSR-3、PSR-4是目前推荐也是常用的规范。PHP-FIG推荐的规范都是解决某个具体的问题。如PSR-1是解决基本的代码风格
推荐规范
PSR-1
如果想编写符合社区标准的PHP代码,首先遵守PSR-1,这是最容易遵守的PHP标准,简单到你可能已经使用了。PSR-1的目的是为遵守这一标准的PHP框架提供代码风格基准
要求
编码:PHP代码文件必须以不带 BOM 的 UTF-8编码;
目的:PHP代码中应该只定义类、函数、常量等声明,或其他会产生副作用的操作(如:生成文件输出以及修改 .ini 配置文件等),二者只能选其一;
自动加载:命名空间以及类必须符合 PSR 的自动加载规范:[PSR-4]() 中的一个;
类名:类的命名必须遵循StudlyCaps大写开头的驼峰命名规范;
常量名:类中的常量所有字母都必须大写,单词间用下划线分隔;
方法名:方法名称必须符合camelCase式的小写开头驼峰命名规范。
PSR-2
与PSR-1相比,PSR-2更严格 ,虽然名称中有严格二字,其实代码写起来也十分容易,现有工具都能自动格式化成符合PSR-2风格的代码
你可能不喜欢PSR-2中的某些指导方针,可这是很多PHP流行框架选择使用的代码风格,你没必要非得遵守PSR-2,但是遵守的话,其他开发者能轻易地理解你的代码,会有更多的人使用你的代码
要求
贯彻PSR-1:代码必须遵循 [PSR-1]() 中的编码规范
缩进:代码必须使用4个空格符而不是「Tab 键」进行缩进。
文件和代码行:每行的字符数应该软性保持在 80 个之内,理论上一定不可多于 120 个,但一定不可有硬性限制。
命名空间:每个namespace命名空间声明语句和use声明语句块后面,必须插入一个空白行。
类:类的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。
方法:方法的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。
可见性:类的属性和方法必须添加访问修饰符(private、protected以及public),abstract以及final必须声明在访问修饰符之前,而static必须声明在访问修饰符之后。
控制结构
控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不可有。
控制结构的开始花括号({)必须写在声明的同一行,而结束花括号(})必须写在主体后自成一行。
控制结构的开始左括号后和结束右括号前,都 一定不可 有空格符。
PSR-3
是针对接口的规范,规定PHP日志记录器组件可以实现的方法
大多数PHP框架都在某种程度上实现了日志功能,在PHP-FIG出现之前,每个框架使用不同的方式实现日志功能,通常会使用专属的实现方式,为了实现重复利用,PHP-FIG制定了PSR-3日志记录器接口
编写PSR-3日志记录器
必须实现Psr\Log\LoggerInterface接口的类,PSR-3接口复用了RFC 5424系统日志协议规定的九个方法
这些方法接受两个参数:$message和$context
使用PSR-3日志记录器
monolog/monolog是最受欢迎的日志记录器
功能
可写入文件、日志、数据库和email发送、传给HipChat/Slack、远程api
PSR-4
支持PSR-4自动加载器标准的PHP组件或框架,使用同一个自动加载器就能找到相关代码,然后将其载入PHP解释器,这是了不起的功能,把现代PHP生态系统中很多可互操作的组件联系起来了
为什么自动加载很重要?
在PHP-FIG发布PSR-4之前,PHP组件或框架的作者使用自己实现的自动加载策略,要整合在一起使用,非常麻烦
得益于PSR-4,只需使用一个自动加载器就能自动加载应用中的所有组件
PSR-4自动加载器策略
推荐规范不要求改变代码的实现方式,只建议如何使用文件系统目录结构和PHP命名空间组织代码
PSR-4的精髓是把命名空间的前缀和文件系统中的目录对应起来