我来帮你制定一份完整的PHP团队代码规范,这份规范会涵盖从基础编码风格到高级实践的所有关键点。

PHP团队代码规范
编码风格基础
1 PSR标准遵循
// 强制遵循PSR-12扩展编码风格 - PSR-1: 基础编码标准 - PSR-4: 自动加载规范 - PSR-12: 扩展编码风格
2 缩进与空格
// 使用4个空格进行缩进(不使用Tab)
if ($condition) {
// 4个空格缩进
$result = someFunction();
}
// 运算符两侧添加空格
$total = $price * $quantity;
$isValid = ($status === 'active') && ($type === 'paid');
// 控制结构关键词后添加空格
if ($condition) {}
while ($condition) {}
for ($i = 0; $i < 10; $i++) {}
foreach ($items as $item) {}
命名规范
1 变量命名
// 使用驼峰式命名(camelCase) $userName = 'John'; $isActive = true; $totalAmount = 100.50; // 私有属性使用下划线前缀(可选) private $_internalId; // 避免使用拼音/缩写 // 错误: $yhbh = '用户编号'; // 正确: $userCode = 'U001';
2 常量定义
// 使用大写字母和下划线
const MAX_RETRY_COUNT = 3;
define('APP_VERSION', '1.0.0');
// 类常量
class DatabaseConfig {
public const HOST = 'localhost';
private const PASSWORD = 'secret';
}
3 函数与方法
// 使用驼峰式命名
function getUserById($id) { }
function calculateTotalAmount($items) { }
// 私有方法使用下划线前缀(可选)
private function _formatResponse($data) { }
4 类名
// 使用帕斯卡命名(PascalCase)
class UserAccount {}
class DatabaseConnection {}
abstract class BaseModel {}
interface CacheInterface {}
trait LoggerTrait {}
注释规范
1 文件头注释
<?php /** * UserService.php * * 用户服务类,处理用户相关业务逻辑 * * @author 团队名称 * @copyright Copyright (c) 2024 * @license MIT License * @link https://example.com * @package App\Services */
2 方法注释
/**
* 根据用户ID获取用户信息
*
* @param int $id 用户ID
* @param bool $withDetails 是否包含详细信息
*
* @return array|null 返回用户数据数组,不存在时返回null
*
* @throws \InvalidArgumentException 当ID小于0时抛出异常
*/
public function getUserById($id, $withDetails = false)
{
if ($id < 0) {
throw new \InvalidArgumentException('User ID cannot be negative');
}
// 方法实现
}
3 复杂逻辑注释
// 使用SQL的LEFT JOIN来避免N+1查询问题 // 先获取所有订单,再批量获取用户信息 $orders = $this->getOrders(); $userIds = array_unique(array_column($orders, 'user_id')); $users = $this->getUsersByIds($userIds);
代码组织结构
1 目录结构
project/
├── app/
│ ├── Controllers/ # 控制器
│ ├── Models/ # 模型
│ ├── Services/ # 服务层(业务逻辑)
│ ├── Repositories/ # 数据访问层
│ ├── Middleware/ # 中间件
│ └── Exceptions/ # 自定义异常
├── config/ # 配置文件
├── database/ # 迁移文件和种子数据
├── routes/ # 路由配置
├── public/ # 公共资源
├── resources/ # 视图和资源文件
└── tests/ # 测试文件
2 单一职责原则
// 每个类只负责一项职责
class UserService {
public function register($data) { }
public function login($credentials) { }
}
class UserRepository {
public function findById($id) { }
public function findByEmail($email) { }
}
class EmailService {
public function sendWelcomeEmail($user) { }
public function sendResetPasswordEmail($user) { }
}
数据库交互规范
1 使用预处理语句
// 必须使用PDO预处理或查询构造器
// 禁止使用字符串拼接SQL
// 使用预处理
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$email]);
// 使用查询构造器
$user = DB::table('users')
->where('email', $email)
->first();
2 数据库操作规范
// 事务处理
DB::transaction(function () {
$order = $this->createOrder($data);
$this->updateInventory($order->products);
$this->chargePayment($order, $amount);
});
// 批量操作
// 避免N+1查询
$users = User::whereIn('status', ['active', 'vip'])->get();
错误处理规范
1 异常层级
// 自定义异常类
class ApiException extends \Exception {
protected $httpCode;
public function __construct($message, $httpCode = 400) {
parent::__construct($message);
$this->httpCode = $httpCode;
}
public function getHttpCode() {
return $this->httpCode;
}
}
class UserNotFoundException extends ApiException {
public function __construct($userId) {
parent::__construct("User with ID {$userId} not found", 404);
}
}
2 全局异常处理
try {
// 业务代码
} catch (UserNotFoundException $e) {
return response()->json(['error' => $e->getMessage()], 404);
} catch (ApiException $e) {
return response()->json(['error' => $e->getMessage()], $e->getHttpCode());
} catch (\Exception $e) {
Log::error('Unexpected error: ' . $e->getMessage());
return response()->json(['error' => 'Internal server error'], 500);
}
依赖注入规范
// 使用构造函数注入,避免静态调用
class OrderController extends Controller {
private $orderService;
private $logger;
public function __construct(
OrderService $orderService,
LoggerInterface $logger
) {
$this->orderService = $orderService;
$this->logger = $logger;
}
public function create(Request $request) {
// 使用注入的服务
$order = $this->orderService->create($request->all());
return response()->json($order);
}
}
测试规范
// 单元测试命名规范
class UserServiceTest extends TestCase {
public function testCreateUserWithValidData()
{
// Arrange
$data = ['name' => 'John', 'email' => 'john@example.com'];
// Act
$user = $this->userService->createUser($data);
// Assert
$this->assertInstanceOf(User::class, $user);
$this->assertEquals('John', $user->name);
}
}
版本控制常规
1 Git提交规范
# 提交信息格式 类型(模块): 描述 # 示例 feat(auth): 添加用户登录功能 fix(order): 修复订单金额计算错误 refactor(service): 重构订单服务类 docs(api): 更新API文档 test(service): 添加服务类测试
2 分支命名
# 功能分支 feature/user-login feature/order-export # 修复分支 bugfix/order-total-calc bugfix/auth-token-expire # 发布分支 release/v1.2.0
安全规范
// 输入验证
public function login(Request $request) {
$validated = $request->validate([
'email' => 'required|email|max:255',
'password' => 'required|min:8'
]);
}
// 防止XSS攻击
$safeHtml = htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// 防止CSRF(Laravel等框架默认)
// 使用CSRF token
// SQL注入防护
$query = "SELECT * FROM users WHERE id = ?";
$stmt = $db->prepare($query);
$stmt->execute([$userInput]);
性能优化规范
// 避免循环内查询
// 错误示例
foreach ($orders as $order) {
$user = User::find($order->user_id); // N+1问题
}
// 正确示例
$userIds = array_unique(array_column($orders, 'user_id'));
$users = User::whereIn('id', $userIds)->get()->keyBy('id');
foreach ($orders as $order) {
$user = $users[$order->user_id] ?? null;
}
// 使用缓存
$user = Cache::remember('user_' . $id, 3600, function () use ($id) {
return User::find($id);
});
// 批量插入
DB::table('users')->insert($userData); // 而不是循环单条插入
文档规范
1 Code Review Checklist
- [ ] 代码符合PSR-12标准
- [ ] 变量和函数命名清晰且有意义
- [ ] 所有公共方法都有PHPDoc注释
- [ ] 没有重复代码(DRY原则)
- [ ] 错误处理完善
- [ ] 有适当的单元测试
- [ ] 数据库查询已优化
- [ ] 安全措施到位(SQL注入、XSS、CSRF防护)
- [ ] 性能优化合理(避免N+1、合理使用缓存)
- [ ] 文档字符串完善
这份规范可以根据团队实际需求进行调整,建议使用工具辅助执行,如:
- PHP_CodeSniffer:检查编码规范
- PHPStan / Psalm:静态分析
- SonarQube:代码质量平台
- PHPUnit:单元测试
- Git Hooks:提交前自动检查
需要我详细解释某个部分,或者需要补充其他方面的规范吗?