深入了解PSR标准:PHP-FIG组织与PSR-1代码风格指南

PSR是PHP StandardsRecommendation的缩写,意思是PHP推荐标准。要了解PSR,首先要知道制定这个标准的人/组织是谁——PHP-FIG。

深入了解PSR标准:PHP-FIG组织与PSR-1代码风格指南

PHP-图

PHP-FIG,全称PHP Framework Interop Group,是一个组织,其成员由一些PHP框架的代表组成。这些人聚集在一起“讨论框架之间的共性并寻找合作方式”。 PHP-FIG制定了PHP框架可以自愿实现的推荐规范,以改善其他框架的通信和共享功能。

PHP-FIG 的使命是实现框架之间的互操作性。

PSR-1:基本编码风格

在文章的开头,我们简单介绍了什么是PSR。 PSR 是 PHP 标准,PSR-1 是 PHP 最基本、最简单的标准。

PHP标签

代码必须放在 或 标记中。不能使用其他标记语法

我相信这对于很多PHPers来说很容易遵守,并且在实际代码中,通常使用普通标签。

编码

所有 PHP 文件必须使用 UTF-8 字符集进行编码,并且不能有字节顺序标记 (BOM)

这个也很常见,就是没有BOM和BOM格式。记得刚开始敲PHP代码的时候,学长们总是很照顾我,一定要使用IDE将其调整为无BOM格式。我当时就一头雾水,后来也跟着做了。现在看到这里,我又查了资料,才知道为什么BOM格式不能使用。 BOM会产生冗余输出,就像无缘无故多出一个空行:

PHP处理BOM头的时候,有时会出现错误,这可能会导致使用header或者session_start等函数时出现文件已经输出的错误。大多数时候,这是因为BOM头被发送出去了。 。因为在php看来,它就变成了一个空格。所以使用无BOM格式

目的

PHP文件可以定义符号(类、属性、函数、常量等),或者执行有副作用的操作(生成结果或处理数据),但它不能同时做两件事

这一规定基本上意味着一个变量、方法或类只能完成一项操作并相应地做一件事情。这样保证了代码清晰易懂,方法和变量单一,各司其职。其实也是为了方便。当未来项目/应用变得更大时,我们可以很好地解耦。

自动加载

PHP 命名空间和类必须符合 PSR-4 自动加载器标准

后面看PSR-4的详细解释。

类名

PHP 类名必须使用驼峰式大小写,也称为标题大小写

驼峰式大小写和分词形式(每个单词用 _ 分隔)。我记得以前有很多争议。有些人支持驼峰形式(GirlFriend),有些人支持分词形式(girl_friend)。现在好多了,他们已经统一了。 ,为了PHP更好的发展,我向支持分词风格的兄弟让步,统一驼峰。我记得公司的CI2项目就用过这种分词,不过也是框架要求。后来在自己的项目中,灵机一动,用了驼峰案例,哈哈,为我的远见点赞~

常量名称

PHP常量名必须大写;

对此应该没有疑问。当我刚开始写PHP的时候,这种写法就已经根深蒂固了。

方法名称

使用驼峰命名法 (boyFriend)

方法的命名和类的命名有些类似,但还是有一些区别:类的命名要求首字母大写(BoyFriendMoney),而方法的命名要求首字母小写(boyFriendMoney)

PSR-2:严格的编码风格

PSR-2 是比 PSR-1 更严格的代码规范。个人和官员都认为开发人员应该遵循更严格的编码标准。在现代PHP生态系统中,统一的风格可以更好地让其他开发人员理解PHP代码。

实施 PSR-1

在使用PSR-2之前,必须先实现PSR-1

缩进

使用四个空格进行缩进。

关于缩进问题,相信有很多争议。在我真正遇到这个问题之前,我一直使用IDE的tab键。那么我和同事在写同一个文件时,代码缩进就会不一样,导致代码结构非常混乱。所以出现这个问题之后,统一了文件缩进的标准,使用四个空格作为缩进。这样的话,即使用不一致的编辑器打开,效果也是一样的。

很多IDE都可以设置tab键,你可以百度搜索一下。

文件和代码行

PHP 文件必须使用 UNIX 样式的换行符 (LF),末尾有一个空行,并且不能使用 PHP 结束 ?> 标记。

起初我不明白为什么纯PHP页面中不使用结束?>标签,但后来我在书中找到了答案。

为了避免意外的输出错误,如果添加了结束标签,并且结束标签后面有一个空行,那么这个空行也会被视为输出,导致错误(例如设置http headers时)

关键词

关键字应小写;

之前不知道在哪里看到过PHP教程。上面编写的 PHP 代码使用大写字母 TRUE 和 FALSE 来表示 true 和 false 等关键字。我一直都是这样用的。后来看到PSR-2规范终于知道应该用小写了,但是我累了~

名称空间

每个命名空间语句后面必须跟一个空行。同样,当使用 use 关键字导入命名空间或为命名空间创建别名时,请在一系列 use 声明后添加一个空行。

类似于:

// 声明本文件的命名空间
namespace My\Friend;

// 导入命名空间
use Other\Friend;

class GirlFrined
{

}

种类

类定义体的左括号应写在类名后面换行;

类定义体的右括号必须写在定义体之后换行;

例子:


class Frined
{
public function getSex()
{
// do something
}
}

方法

方法定义体的左括号应写在方法名后面换行;

方法定义体的右括号必须换行写在方法定义体之后;

请参考上面类示例中的方法示例。

能见度

1. 类中的每个属性和方法都必须声明可见性。可见性由 public、protected 或 private 指定,其作用是确定类内部和外部如何访问该属性。

2. 在私有方法名称前添加下划线。

3.如果类属性被声明为abstract和final,这两个限定符必须放在visibility关键字之前

4. 如果属性或方法被声明为静态,则该限定符必须放在visibility关键字之后

例子:

// 1、2
public $sex;
private $_sex;
protected $sex;

// 3、
abstract public $sex;
final public $sex;

// 4、
public static $sex;
public static $age;

控制结构

所有控制结构关键字后面都必须跟一个空格。控制结构关键字包括:if、elseif、else、switch、case、while、do while、for、foreach、try、catch。如果控制结构关键字后有一对括号,则左括号后不能有空格,右括号前不能有空格。与类和方法的定义体不同,控制结构关键字后面的左括号应与控制机制关键字写在同一行。控制结构关键字后面的右括号必须写在单独的行上。

例子:

/**
* 错误的示例:
* 这里有4个错误:
* 1、if关键词后面和圆括号之前没有空格
* 2、圆括号前后有空格
* 3、后圆括号和起始括号之前没有空格
* 4、else关键词前后没有空格
**/
if( 1 == true ){
// do something
}else{
// do something
}

/**
* 正确的示例:
**/
if (1 == true) {
// do something
} else {
// do something
}

PSR-3:记录器接口记录器

PHP-FIG发布的第三个推荐规范与前两个不同。这个有点特殊,是一个接口。指定 PHP 记录器组件可以实现的方法。

记录器是将不同重要性的消息写入指定输出的对象。记录的消息用于诊断、检查和解决应用程序中的操作、稳定性和性能问题。例如:开发时将调试信息写入文本文件、将网站流量统计记录到数据库等。

我相信基本上所有框架都实现了日志记录功能,那么如果我想使用PSR-3标准记录器该怎么办呢?首先,必须满足两点:

日志功能委托第三方库实现

最终用户可以选择他们喜欢的记录器组件

编写 PSR-3 记录器

符合 PSR-3 推荐规范的 PHP 记录器组件必须包含实现 Psr\Log\LoggerInterface 接口的 PHP 类。 PSR-3接口重用了RFC 5424系统日志协议,规定必须实现9个方法:

我从PHP-FIG官网获取了以下代码。如果您想了解更多信息,您可以点击这里。


namespace Psr\Log;

interface LoggerInterface
{

public function emergency($message, array $context = array());
public function alert($message, array $context = array());
public function critical($message, array $context = array());
public function error($message, array $context = array());
public function warning($message, array $context = array());
public function notice($message, array $context = array());
public function info($message, array $context = array());
public function debug($message, array $context = array());
public function log($level, $message, array $context = array());
}

此类中的每个方法都对应于 RFC 5424 协议的一个日志级别,并且都接受两个参数。第一个参数必须是字符串或具有 __toString() 方法的对象。第二个参数是一个数组,可选参数;

如果要编写符合PSR-3规范的记录器,则必须创建一个实现Psr\Log\LoggerInterface接口的PHP类,并提供该接口中每个方法的具体实现。

使用 PSR-3 记录仪

PSR-3规范出来后,实现这个效果的组件太多了。这里就不介绍如何实现这个接口的类了。现在已经有成熟的logger组件,推荐使用monolog/monolog。该组件完全实现了 PSR-3 接口,并且可以使用自定义消息格式化程序和处理程序进行扩展。

如果monolog不能满足日常使用,我们可以在此基础上扩展自己的方法,这也很简单;

使用独白的示例:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// 准备日志记录器
$logger = new Logger('my_logger');
$logger->pushHandler(new StreamHandler('logs/development.log', Logger::DEBUG));
$logger->pushHandler(new StreamHandler('logs/production.log', Logger::WARNING));
// 使用日志记录器
$logger->debug('This is debug message');
$logger->debug('This is warning message');

PSR-4:自动装弹机

PHP-FIG发布的第四个推荐规范描述了标准的自动加载器策略; autoloader 是指在程序运行时按需查找并加载 PHP 类、接口或特征。进入装载机。

自动装载机策略

PSR-4建议并不要求改变代码的实现方式,而只是建议如何使用文件系统目录结构和PHP命名空间来组织代码。 PSR-4 **依赖** PHP 命名空间和文件系统目录结构来查找和加载 PHP 类、特征和接口

为什么自动装载机很重要

举一个很常见的场景,我们通常使用 require 和 include 等方法来引入文件。这种方法简单可靠,但是如果我们引入一两个还可以,但是当我们运行一个项目时,我们需要引入几十个。至于文件,我们不是要写几十个require或者include吗?这样既不方便也不美观,所以 PHP-FIG 就考虑到了这一点,并标准化了统一的 autoloader 策略;

如何使用自动加载器

建议使用依赖管理器 Composer 自动生成的 PSR-4 自动加载器。

现代PHP框架,如laravel、Yii、TP5等,都采用了依赖Composer的autoloader策略,方便我们下载组件并引入合适的类。

PSR-ME:制定您自己的 PHP 规范

遵循PSR-1和PSR-2的使用规范

变量、方法和类的适当且简洁的命名。做什么事情一目了然

尝试编写高内聚、低耦合的代码

保持代码结构干净、美观

总结

PHP-FIG 引入的 PHP 规范并不一定意味着所有 PHP 开发人员都必须遵守。制定这个规范的目的是为了让全世界的PHP开发者更简单、更容易的查看代码。创建的组件/轮子可以被所有开发人员轻松了解和使用。也降低了我们的工作投入率,实现了更大的工作效率,让产出大于投入,让效率更高更快。

希望以上内容对大家有所帮助。如有需要,可以添加下面的二维码进群交流,学习中高级PHP技术。

如果您想与PHP高手交流,请添加微信并进群。

如果您想获取学习资料,添加微信,给您发资源

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

53阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

45阅读

php一句话木马,一句话木马ctf

2026年10月05日

48阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

50阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

47阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

42阅读