PHP社区已从中心化的框架进化为分布式生态系统,分布式生态系统中组件效率高、互操作性好、作用单一。
PHP-FIG
PHP-FIG(PHP Framework Interop Group)由一些PHP框架代表组成,聚在一起“讨论项目之间的共性,寻找可以合作的方式”。他们的使命是实现框架的互操作性,通过接口、自动加载机制、标准风格,让框架相互合作。
PSR
PSR(PHP Standards Recommendation)是PHP推荐标准的简称,由PHP-FIG制定。规范名称以PSR-开头,后跟数字。PHP-FIG发布的推荐规范
- PSR-1 基本的代码风格
- PSR-2 严格的代理风格
- PSR-3 日志记录器接口
- PSR-4 自动加载
PSR-1 基本的代码风格
编写符合社区标准的PHP代码,必须满足以下要求
- PHP 标签
必须将PHP代码放在<?php ?>
或<? ?>
标签中,不得使用其他PHP标签句法。 - 编码
所有PHP文件必须使用UTF-8
字符集编码,不能有字节顺序标记(BOM,Byte Order Mark)。 - 目的
一个PHP文件可定义符号,或执行有副作用的操作,但不能同时做这两件事。 - 自动加载
PHP命名空间和类必须遵守PSR-4自动加载标准,仅需为PHP符号选择合适的名称,并把定义符号的文件放在预期的位置。 - 类的名称
PHP类的名称必须采用大驼峰法(CamelCase),又叫标题式(TitleCase)。 - 常量命名
PHP常量的名称必须全部大写字母,若需要使用下划线分割单词。 - 方法命名
PHP方法名称必须使用小驼峰(camelCase)。
PSR-2 严格的代码风格
- 贯彻PSR-1
使用PSR-2代码风格钱必须贯彻PSR-1代码风格。 - 缩进
PHP代码使用4个空格缩进而非制表符缩进。 - 文件和代码行
PHP代码必须使用UNIX分割的换行符(LF),最后要有一个空行,而且不能使用PHP关闭标签?>
。
每行代码不能超过80个字符,至少不能超过120个字符。
每行末尾不能有空格。 - 关键字
PHP关键字必须使用小写字母 - 命名空间
每个命名空间声明语句后必须跟着一个空行 - 类
类定义体的起始括号应该在类名之后新起一行写。
类扩展或实现接口,extends
和implements
关键字必须和类名写在同一行。 - 方法
方法定义体的起始括号要在方法名之后新起一行写,结束扩展要在方法定义体之后新起一行写。
方法的参数起始圆括号之后没有空格,结束圆括号之前也没有空格。
方法的每个参数,除最后一个后有一个逗号和空格。 - 可见性
类中的属性和方法均要声明可见性,可见性由public
、private
、protected
指定,其作用是决定在类的内部和外部如何访问属性和方法。 - 控制结构
所有控制结构关键字后都要有一个空格,若控制结构关键字后有一对圆括号,起始圆括号后面不能有空格,结束圆括号之前不能有空格。
与类和方法的定义体不同,控制结构关键字后面的起始括号应该和控制结构关键字写在同一行。
控制结构关键字后面的结束括号必须单独写在一行。
PSR-3 日志记录器
推荐 monolog/monolog
组件( https://packagist.org/packages/monolog/monolog)。
Monolog 组件完全实现 PSR-3 接口,自定义消息格式化和处理程序扩展。
- 可将消息写入文本、系统日志、数据库
- 邮件发送
- 支持 HipChat、Slack、网络服务器和远程API
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// 初始化日志记录器
$log = new Logger('app');
$log->pushHandler(new StreamHandler('logs/development.log'), Logger::DEBUG);
$log->pushHandler(new StreamHandler('logs/production'), Logger::WARNING);
// 使用日志记录器
$log->debug('This is a development debug message');
$log->warning('This is a production warning message');
PSR-4 自动加载器
自动加载器策略指在运行时按需查找PHP类、接口、形状,并将其载入PHP解释器。
符合此规范的组件包括:Symfony、Doctrine、Monolog、Twig、Guzzle、SwiftMailer、PHPUnit、Carbon...
PSR-4策略用于在运行时查找并加载PHP类、接口、形状,它不要求改变代码的实现方式,只建议如何使用文件系统目录结构和PHP命名空间组织代码。
PSR-4自动加载器策略依赖PHP命名空间和文件系统目录结构查找并加载PHP类、接口、形状。
PSR-4 精髓是把命名空间的前缀和文件系统中的目录对应起来,命名空间前缀可是顶层命名空间,也可是顶层命名空间加上任意子命名空间,相当灵活。
PSR-4 自动加载实现代码
<?php
// 使用SPL注册自动加载函数
spl_autoload_register(function($class){
$prefix = 'App\\Foo';//项目命名空间前缀
$basedir = __DIR__.'/src/';//项目命名空间对应的根目录
//判断传入类是否使用命名空间前缀
if( strncmp($prefix, $class, strlen($prefix))!==0 ){
return;
}
// 类去除命名空间前缀后的类名
$relative_class = substr($class, strlen($prefix));
// 将命名空间转换为目录
$filename = str_replace('\\', '/', $relative_class);
// 判断文件是否存在并加载
$file = $basedir.$filename.'.php';
if(file_exists($file)){
require $file;
}
});