# PHP命名规范:PSR-1/PSR-2 代码风格指南
PHP作为一门广泛使用的服务器端脚本语言,其代码风格和命名规范对于团队协作和项目维护至关重要。本文将详细介绍PHP标准推荐(PSR)中的PSR-1和PSR-2规范,帮助你编写更规范、更易读的PHP代码。
## 一、PSR-1基础编码规范
### 1. 基本要求
- 文件必须使用`<?php`或`<?=`标签
- 文件编码必须为UTF-8 without BOM
- 文件应该只声明类、函数、常量等,或者产生副作用(如输出、修改ini设置等),但不应该同时做这两件事
### 2. 类命名规范
- 类名必须使用大驼峰式(StudlyCaps)命名法
- 类文件名必须与类名一致,包括大小写
- 命名空间和类名必须遵循自动加载规范PSR-4
```php
// 正确示例
namespace Vendor\Model;
class UserProfile
{
// ...
}
```
### 3. 类常量命名
- 类常量必须全部大写,单词间用下划线分隔
```php
class Database
{
const DEFAULT_PORT = 3306;
const MAX_CONNECTIONS = 100;
}
```
### 4. 方法命名
- 方法名必须使用小驼峰式(camelCase)命名法
```php
class UserController
{
public function getUserById($id)
{
// ...
}
}
```
## 二、PSR-2编码风格规范
### 1. 基本格式要求
- 代码必须遵循PSR-1规范
- 代码必须使用4个空格缩进,而不是制表符
- 行长度不应有硬性限制,但应尽量保持在80个字符以内
- 每行结尾不能有空格
- 文件必须以一个空行结束
### 2. 关键字和常量
- PHP关键字必须小写
- PHP常量`true`、`false`、`null`必须小写
```php
// 正确示例
$isValid = true;
$value = null;
```
### 3. 命名空间和use声明
- 命名空间声明后必须有一个空行
- 所有的use声明必须在命名空间声明之后
- 每个use声明必须单独一行
- use声明块后必须有一个空行
```php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
// 这里空一行
class ClassName
{
// ...
}
```
### 4. 类、属性和方法
- 类的开始花括号`{`必须写在类声明后自成一行,结束花括号`}`必须写在类主体后自成一行
- 方法的开始花括号`{`必须写在函数声明后自成一行,结束花括号`}`必须写在函数主体后自成一行
- 属性和方法的可见性必须声明(`public`、`protected`或`private`),`abstract`和`final`声明必须在可见性之前,`static`声明必须在可见性之后
- 属性和方法名不应该以下划线开头来表示可见性
```php
abstract class AbstractClass
{
protected static $instance;
final public static function getInstance()
{
// ...
}
abstract protected function doSomething();
}
```
### 5. 控制结构
- 控制结构关键词后必须有一个空格
- 左括号`(`后不能有空格
- 右括号`)`前不能有空格
- 右括号`)`和开始花括号`{`间必须有一个空格
- 结构体内容必须缩进
- 结束花括号`}`必须单独一行
- 条件括号必须分开多行书写,条件较多时
```php
if ($condition1
&& $condition2
&& $condition3
) {
// if 结构体
} elseif ($condition4) {
// elseif 结构体
} else {
// else 结构体
}
switch ($value) {
case 1:
echo 'Case 1';
break;
case 2:
echo 'Case 2';
break;
default:
echo 'Default case';
break;
}
```
### 6. 方法调用
- 方法名和左括号`(`之间不能有空格
- 左括号`(`后不能有空格
- 右括号`)`前不能有空格
- 参数列表中,逗号前不能有空格,逗号后必须有一个空格
```php
$result = someFunction($param1, $param2, $param3);
```
## 三、常见问题与最佳实践
1. **关于下划线的使用**:PSR规范不鼓励使用下划线前缀来表示可见性,这是PHP4时代的遗留做法。
2. **关于行长度**:虽然PSR-2没有硬性限制行长度,但保持80-120个字符的宽度有助于代码可读性。
3. **关于数组格式**:虽然PSR-2没有明确规定数组格式,但建议短数组使用单行,长数组采用多行格式:
```php
// 短数组
$short = ['one', 'two', 'three'];
// 长数组
$long = [
'first' => 'value',
'second' => 'value',
'third' => 'value',
];
```
4. **关于链式调用**:当方法链式调用较长时,建议每个方法单独一行,缩进一级:
```php
$queryBuilder
->select('u.*')
->from('users', 'u')
->where('u.active = 1')
->orderBy('u.name', 'ASC');
```
## 四、工具推荐
1. **PHP_CodeSniffer**:可检查代码是否符合PSR标准
2. **PHP-CS-Fixer**:可自动修复代码风格问题
3. **IDE插件**:大多数现代IDE(如PHPStorm)都内置了对PSR规范的支持
## 结语
遵循PSR-1和PSR-2规范不仅能提高代码的可读性和可维护性,还能使团队成员更容易理解和协作开发。虽然刚开始可能需要一些适应时间,但一旦形成习惯,这些规范将成为你编写高质量PHP代码的有力保障。
记住,编码规范的目标不是限制创造力,而是通过统一的标准提高团队协作效率。在实际项目中,可以根据团队的具体情况适当调整,但保持一致性是最重要的原则。