本文目录导读:

我来详细解答PHP代码合规(即代码规范)的问题。
遵循PSR标准
PHP-FIG(PHP Framework Interop Group)制定了PSR标准,最常用的是:
PSR-1:基础编码规范
<?php
// 1. 文件使用 <?php 或 <?= 标签
// 2. 文件必须不含BOM的UTF-8编码
// 3. 命名空间和类必须使用自动加载
namespace App\Models;
class UserController
{
// 4. 类名使用首字母大写的驼峰式
// 5. 常量全部大写,下划线分隔
const MAX_LOGIN_ATTEMPTS = 5;
// 6. 方法名使用首字母小写的驼峰式
public function getUserProfile()
{
}
}
PSR-2:编码风格规范
<?php
namespace App\Services;
use App\Models\User;
use App\Exceptions\UserException;
class OrderService
{
private $user;
// 1. 花括号另起一行
public function processOrder(array $items, $userId)
{
// 2. 控制结构花括号在同一行
if (empty($items)) {
throw new UserException('订单不能为空');
}
// 3. 4个空格缩进,不要用Tab
foreach ($items as $item) {
$this->validateItem($item);
}
return true;
}
// 4. 方法间空一行
private function validateItem($item)
{
return isset($item['id']) && $item['price'] > 0;
}
}
命名规范
<?php
// 类名:大驼峰
class DatabaseConnection {}
// 接口名:大驼峰 + Interface后缀
interface CacheInterface {}
// 方法名:小驼峰
public function getUserById($id) {}
// 变量名:小驼峰
$userName = '张三';
// 常量:全部大写
define('MAX_RETRY_COUNT', 3);
// 私有属性:下划线开头(可选)
private $_dbConnection;
安全合规编码
<?php
// 1. SQL注入防护 - 使用预处理语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$userId]);
// 2. XSS防护 - 输出转义
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// 3. CSRF防护 - 使用Token
session_start();
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF验证失败');
}
// 4. 输入验证
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
throw new InvalidArgumentException('无效的邮箱地址');
}
代码组织规范
<?php
/**
* @file UserService.php
* @brief 用户服务层
* @author 开发者
* @date 2024-01-01
*/
namespace App\Services;
use App\Models\User;
use App\Repositories\UserRepository;
class UserService
{
private $userRepo;
/**
* 依赖注入
* @param UserRepository $userRepo
*/
public function __construct(UserRepository $userRepo)
{
$this->userRepo = $userRepo;
}
/**
* 创建用户(单一职责原则)
* @param array $data
* @return User
* @throws ValidationException
*/
public function createUser(array $data): User
{
$this->validateUserData($data);
$data['password'] = password_hash($data['password'], PASSWORD_BCRYPT);
$data['created_at'] = date('Y-m-d H:i:s');
return $this->userRepo->save($data);
}
// 私有方法辅助主逻辑
private function validateUserData(array $data): void
{
$required = ['name', 'email', 'password'];
foreach ($required as $field) {
if (empty($data[$field])) {
throw new ValidationException("缺少必要字段: {$field}");
}
}
}
}
使用工具自动检查
# 1. PHP CodeSniffer - 检查代码规范 phpcs --standard=PSR2 app/ # 2. PHP CS Fixer - 自动修复格式 php-cs-fixer fix app/ --rules=@PSR2 # 3. PHPStan - 静态分析 phpstan analyse app/ --level=max
推荐的编码规范检查清单
<?php
// ✅ 正确做法
class UserManager {
public function findUser(int $id): ?User
{
// 类型声明
}
}
// ❌ 错误做法
class usermanager {
public function find_user($id)
{
// 不规范的命名和类型
}
}
// ✅ 正确的注释
/**
* 获取用户信息
*
* @param int $userId 用户ID
* @return array 用户信息数组
* @throws UserNotFoundException
*/
// ❌ 错误的注释
// 获取用户信息
// @param $id 用户ID
推荐配置
在 composer.json 中添加:
{
"require-dev": {
"squizlabs/php_codesniffer": "^3.7",
"friendsofphp/php-cs-fixer": "^3.0",
"phpstan/phpstan": "^1.0"
},
"scripts": {
"check": "phpcs --standard=PSR12 src/",
"fix": "php-cs-fixer fix src/"
}
}
这样既能保证代码规范,又能提高代码质量和安全性。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播