PHP 项目 PR 提交规范指南
📋 目录
PR 提交规范
PR 标题格式
[类型] 简要描述(不超过50个字符)
示例:
[Feature] 添加用户登录功能
[Fix] 修复缓存过期问题
[Refactor] 重构数据库查询逻辑
PR 类型说明
| 类型 | 说明 | 示例 |
|---|---|---|
| Feature | 新功能 | 添加支付接口 |
| Fix | 修复Bug | 修复空指针异常 |
| Refactor | 重构代码 | 优化代码结构 |
| Style | 格式修改 | 调整缩进、格式 |
| Test | 测试相关 | 添加单元测试 |
| Docs | 文档更新 | 更新API文档 |
| Perf | 性能优化 | 优化查询效率 |
| Chore | 构建/工具 | 更新依赖版本 |
PR 内容要求
必须包含:
## 变更原因
- 为什么要做这个变更
- 解决了什么问题
## 测试计划
- [ ] 单元测试
- [ ] 集成测试
- [ ] 手工测试
## 影响范围
- 影响哪些功能模块
- 是否需要数据库迁移
Commit Message 规范
标准格式
<type>(<scope>): <subject>
<body>
<footer>
实际示例
# 新功能 feat(auth): 添加用户登录功能 # 修复Bug fix(cache): 修复Redis缓存过期问题 # 重构 refactor(database): 重构ORM查询逻辑 # 性能优化 perf(query): 优化大表查询性能 # 文档 docs(api): 更新用户接口文档
Commit 类型规范
| Type | 用途 | 示例 |
|---|---|---|
| feat | 新功能 | feat: 添加订单导出 |
| fix | 修复 | fix: 修复登录报错 |
| docs | 文档 | docs: 更新README |
| style | 格式 | style: 调整代码格式 |
| refactor | 重构 | refactor: 重构验证逻辑 |
| test | 测试 | test: 添加测试用例 |
| chore | 构建 | chore: 更新依赖 |
代码规范
PSR 标准
PHP 项目必须遵循 PSR-12 编码规范

<?php
declare(strict_types=1);
namespace App\Services;
class UserService
{
public function createUser(string $name, string $email): User
{
// 使用强制类型声明
// 驼峰命名
// 4个空格缩进
}
}
命名规范
| 元素 | 规范 | 示例 |
|---|---|---|
| 类名 | 大驼峰 | UserController |
| 方法 | 小驼峰 | getUserInfo() |
| 变量 | 小驼峰 | $userName |
| 常量 | 全大写 | MAX_LIMIT |
| 函数 | 小驼峰 | get_user() ❌ → getUser() ✅ |
代码质量要求
// ✅ 遵循规范
class OrderService
{
/**
* 创建订单
*
* @param array $data 订单数据
* @return Order
* @throws \InvalidArgumentException
*/
public function createOrder(array $data): Order
{
// 1. 参数验证
if (empty($data['user_id'])) {
throw new \InvalidArgumentException('用户ID不能为空');
}
// 2. 业务逻辑
// 3. 返回结果
}
}
// ❌ 不遵循规范
class orderService
{
public function create_user($data)
{
// 没有类型声明
// 没有文档注释
// 命名不规范
}
}
测试要求
PHPUnit 测试示例
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
use App\Services\UserService;
class UserServiceTest extends TestCase
{
protected UserService $userService;
protected function setUp(): void
{
parent::setUp();
$this->userService = new UserService();
}
/** @test */
public function it_can_create_a_user()
{
$user = $this->userService->createUser('张三', 'test@example.com');
$this->assertInstanceOf(User::class, $user);
$this->assertEquals('张三', $user->getName());
$this->assertEquals('test@example.com', $user->getEmail());
}
}
覆盖率要求
- 新代码覆盖率 ≥ 80%
- 关键业务逻辑覆盖率 ≥ 90%
- 核心方法必须有测试
PR 模板
完整 PR 模板示例
## 描述 ### 变更内容 - 添加用户注册功能 - 实现邮箱验证 - 添加短信验证码 ### 为什么需要这个变更 - 支持新用户注册 - 提高账号安全性 ### 触发条件/相关Issue - Fixes #123 - Closes #456 ## 变更类型 - [x] 新功能 - [ ] Bug修复 - [ ] 代码重构 - [ ] 性能优化 - [ ] 文档更新 - [ ] 测试 ## 测试 ### 单元测试 - [x] UserRegistrationTest - [x] EmailVerificationTest ### 集成测试 - [x] 微信支付 - [ ] 支付宝支付 ### 手工测试步骤 1. 打开注册页面 2. 输入邮箱和密码 3. 点击注册按钮 4. 验证收到验证邮件 ## 检查清单 - [x] 代码遵循 PSR-12 规范 - [x] 所有测试通过 - [x] 无语法错误 - [x] 无未使用变量 - [x] 包含必要的注释 - [ ] 更新相关文档 - [x] 检查安全性(SQL注入、XSS等) ## 影响范围 - 影响模块:用户认证系统 - 是否需要数据库迁移:是 - 是否需要更新配置:否 ## 截图/演示 (如有必要,添加截图) ## 部署说明 - 需要执行 `composer install` - 需要更新环境变量
Git 操作规范
分支命名
feature/feature-name
fix/bug-name
refactor/refactor-name
docs/documentation-name
示例:
feature/user-login
fix/cache-expire-bug
提交流程
# 1. 拉取最新的远程代码 git pull origin master # 2. 创建功能分支 git checkout -b feature/user-login # 3. 编写代码并提交 git add . git commit -m "feat: 添加用户登录功能" # 4. 推送分支 git push origin feature/user-login # 5. 创建PR(在GitHub/GitLab等平台)
常见问题处理
# 解决冲突 git merge master # 或 git rebase master # 修改提交信息 git commit --amend # 合并多个提交(squash) git rebase -i HEAD~3
代码检查清单
✅ 必查项
- [ ] 是否遵循 PSR-12 规范?
- [ ] 是否有严格的类型声明?
- [ ] 是否使用了 PHP 7.4+ 的语法特性?
- [ ] 是否有过长方法(建议 < 50行)?
- [ ] 是否有过度复杂的条件逻辑?
- [ ] 是否包含异常处理?
- [ ] 日志记录是否完善?
❌ 禁止项
- 禁止使用
var_dump、print_r调试代码 - 禁止使用全局变量
- 禁止使用单字母变量名(除循环变量)
- 禁止未使用的
use语句 - 禁止过长函数(超过100行)
- 禁止使用
eval等危险函数
自动化工具配置
PHP_CodeSniffer
# composer.json 中添加
"require-dev": {
"squizlabs/php_codesniffer": "^3.6",
"phpmd/phpmd": "^2.12"
}
Pre-commit 钩子
// .pre-commit-config.yaml
repos:
- repo: https://github.com/nunomaduro/phpinsights
rev: 2.0.2
hooks:
- id: phpinsights
💡 建议:团队内部应统一使用上述规范,并通过 CI/CD 工具自动检查代码质量,这不仅能提高代码质量,还能减少代码评审的工作量。
📌 重要:每次提交前,务必运行
composer test和composer lint确保代码质量。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播