本文目录导读:

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 应用,具体的实现可能因项目而异,但这些是最核心的原则。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播