本文目录导读:

PHP 最佳实践涵盖多个方面,我来系统地总结一下:
代码规范与风格
PSR 标准
// 遵循 PSR-12 编码规范
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function store(Request $request): User
{
// 严格类型声明
declare(strict_types=1);
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users'
]);
return User::create($validated);
}
}
命名规范
// ✅ 正确示例
class UserService {}
interface PaymentGateway {}
trait Notifiable {}
$userRepository; // 变量使用驼峰
const MAX_RETRY_COUNT = 3; // 常量全部大写
// ❌ 避免
class user_service {}
$user_repo;
安全性最佳实践
输入验证与过滤
// 使用 filter_var 和验证
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
throw new InvalidArgumentException('Invalid email');
}
// 使用 PHP 8+ 的强类型
function processUserData(string $name, int $age): array
{
// 验证逻辑
if ($age < 0 || $age > 150) {
throw new InvalidArgumentException('Invalid age');
}
return compact('name', 'age');
}
PDO 预处理语句
class Database
{
private PDO $connection;
public function findUser(int $id): ?array
{
$stmt = $this->connection->prepare(
'SELECT * FROM users WHERE id = :id'
);
$stmt->execute([':id' => $id]);
return $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
}
}
XSS 防护
// 输出转义
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// 在模板中使用 Laravel 的 {{ }} 自动转义
// {{ $content }} 而不是 {!! $content !!}
性能优化
启用 OPcache
; php.ini 配置 opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.validate_timestamps=0 ; 生产环境
数据库优化
// 使用索引和查询优化
$users = DB::table('users')
->where('active', true)
->when($search, function ($query, $search) {
return $query->where('name', 'like', "%{$search}%");
})
->select(['id', 'name', 'email'])
->paginate(15); // 分页避免加载全部数据
缓存策略
// Redis 缓存示例
class CacheService
{
public function getUser(int $id): User
{
$key = "users:{$id}";
return Cache::remember($key, now()->addHour(), function () use ($id) {
return User::with('profile')->findOrFail($id);
});
}
}
架构设计
使用依赖注入
interface UserRepositoryInterface
{
public function find(int $id): ?User;
}
class UserRepository implements UserRepositoryInterface
{
public function find(int $id): ?User
{
return User::find($id);
}
}
class UserService
{
public function __construct(
private UserRepositoryInterface $userRepository
) {}
public function getUser(int $id): User
{
return $this->userRepository->find($id); // 返回对象保证可空
}
}
分层架构
app/
├── Controllers/ # 控制器层
├── Services/ # 业务逻辑层
├── Repositories/ # 数据访问层
├── Models/ # 模型层
└── DTOs/ # 数据传输对象
测试最佳实践
单元测试
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
private Calculator $calculator;
protected function setUp(): void
{
$this->calculator = new Calculator();
}
public function testAddition(): void
{
$result = $this->calculator->add(2, 3);
$this->assertEquals(5, $result);
}
public function testDivisionByZero(): void
{
$this->expectException(\DivisionByZeroError::class);
$this->calculator->divide(10, 0);
}
}
错误处理与日志
class ErrorHandler
{
public function handle(\Throwable $e): void
{
// 记录日志
Log::error('Application error', [
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString()
]);
// 返回友好错误信息
if (config('app.debug')) {
throw $e; // 开发环境
} else {
// 生产环境返回统一错误页面
abort(500);
}
}
}
现代 PHP 特性
PHP 8+ 特性使用
// 构造函数属性提升
class Product
{
public function __construct(
private string $name,
private float $price,
private ?string $description = null
) {}
}
// 匹配表达式
$result = match($action) {
'create' => $this->create(),
'update' => $this->update(),
default => throw new InvalidArgumentException('Unknown action')
};
// 命名参数
setTime(hour: 14, minute: 30, second: 0);
// 空安全操作符
$city = $user?->address?->city ?? 'Unknown';
// 枚举
enum UserStatus: string {
case Active = 'active';
case Inactive = 'inactive';
case Blocked = 'blocked';
}
部署最佳实践
# deploy.yml 示例
deploy:
pre_deploy:
- composer install --optimize-autoloader --no-dev
- php artisan migrate --force
- php artisan config:cache
- php artisan route:cache
- php artisan view:cache
post_deploy:
- php artisan queue:restart
- php artisan optimize
环境配置
// .env.example 示例 APP_ENV=production APP_DEBUG=false APP_URL=https://example.com DB_HOST=localhost DB_DATABASE=production_db CACHE_DRIVER=redis QUEUE_CONNECTION=redis
实践建议清单
✅ 必须做:
- 使用框架(Laravel/Symfony)而不是裸PHP
- 启用错误报告(开发环境)
- 使用 PSR 自动加载
- 定期更新依赖(composer update)
- 使用版本控制(Git)
❌ 避免:
- 不要使用
extract()或eval() - 不要直接拼接 SQL
- 不要使用全局变量
- 避免超长方法(保持单一职责)
这些实践能帮助你构建更安全、高效、可维护的 PHP 应用,具体的实现可能因项目而异,但这些是最核心的原则。