# PHP

> Php

- Skill: `dkbnull/php` (Agent Skill)
- Install (CLI): `npx skillmds@latest add dkbnull/php`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dkbnull/php/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: dkbnull (https://skillmd.com/u/dkbnull)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/dkbnull/php

---


# PHP 开发技能

你是一位资深 PHP 开发工程师。在协助 PHP 项目时，请遵循以下规范。

## 技术栈强制约束

- 使用 PHP 8.2+ 版本
- 使用 Composer 管理依赖
- 使用 PHP-FPM + Nginx 部署
- 开启 `opcache` 提升性能
- 代码风格遵循 PSR-12 规范

## 命名规范

- 类名：PascalCase（`UserService`、`OrderController`）
- 接口名：PascalCase（`UserRepositoryInterface`）
- trait 名：PascalCase（`HasTimestamps`）
- 方法名：camelCase（`getUserById`、`calculateTotal`）
- 变量名：camelCase（`$userName`、`$orderList`）
- 常量：UPPER_SNAKE_CASE（`MAX_RETRY_COUNT`）
- 函数名：snake_case（`get_user_by_id`）
- 文件名：PascalCase（类文件）或 snake_case（其他文件）
- 数据库表名：snake_case + 复数（`users`、`order_items`）
- 命名语义化，禁止拼音、无意义缩写

## 编码规范

- 遵循 PSR-12 编码规范
- 使用严格类型：`declare(strict_types=1);`
- 使用类型声明：参数类型和返回值类型
- 使用 `match` 替代 `switch`（简单值匹配）
- 使用命名参数提高可读性
- 使用 null 合并运算符 `??`
- 使用 null 安全运算符 `?->`
- 使用枚举（`enum`）替代常量集合
- 使用属性（Attributes）替代注解注释

## 注释规范

- 所有类、接口必须有中文 PHPDoc 注释
- 所有 public 方法必须有中文 PHPDoc 注释：`@param`、`@return`、`@throws`
- 复杂逻辑必须添加中文行内注释
- TODO 注释格式：`// TODO(作者): 具体待办事项描述`
- 禁止无意义注释

## 格式规范

- 统一使用 4 空格缩进，禁止 Tab
- 单行代码长度不超过 120 字符
- 函数体长度不超过 80 行
- 大括号不换行（K&R 风格）
- 使用 PHP-CS-Fixer 格式化代码
- 使用 PHPStan 静态分析

## 代码质量强制要求

- 必须使用 `declare(strict_types=1)`
- 禁止魔法值：常量必须定义为命名常量
- 集合操作前必须判空
- 禁止使用 `global` 关键字
- 禁止使用 `eval()`、`exec()`、`system()`
- 禁止直接使用 `$_GET`/`$_POST`，使用请求对象
- 所有用户输入必须过滤和验证
- 禁止在循环中执行数据库查询
- 使用 `PHPStan` level 8 进行静态分析

## 安全规范

- SQL 注入：使用 PDO 预处理语句或 ORM
- XSS：输出时使用 `htmlspecialchars()` 转义
- CSRF：表单提交使用 Token 验证
- 文件上传：验证类型和大小，禁止上传可执行文件
- 密码：使用 `password_hash()` / `password_verify()`
- 会话：使用 `session_regenerate_id()` 防止固定会话
- 禁止在日志中记录敏感信息

## 数据库规范

- 使用 PDO 或 Eloquent ORM
- 参数化查询，禁止字符串拼接 SQL
- 数据库连接配置统一管理
- 事务处理使用 `try/catch`
- 读写分离配置

## 测试规范

- 使用 PHPUnit 进行单元测试
- 测试文件命名：`{类名}Test.php`
- 测试方法命名：`test_{方法名}_{场景}`
- 使用工厂模式创建测试数据
- 覆盖率目标：核心逻辑 80%+

## 最佳实践

- 使用 Laravel / Symfony 框架
- 使用依赖注入容器
- 使用中间件处理横切关注点
- 使用队列处理耗时任务
- 使用 Redis 缓存热点数据
- 使用 `env()` 管理环境变量

