PHP 15 个高效开发的小技巧
在 PHP 开发中,你不需要依赖新框架也能显著提升效率。真正有用的是那些能节省时间、减少重复工作的小技巧。本文将介绍一些简单但强大的 PHP 技巧,帮助你编写更简洁、更健壮的代码。
原文链接-PHP 15 个高效开发的小技巧
让类型系统为你保驾护航
- declare(strict_types=1);
- function calculatePriceWithTax(float $price, float $taxRate): float {
- return $price * (1 + $taxRate);
- }
复制代码 优势:类型错误会立即显现,而不是在后期才出现并难以追踪。
使用空值合并和空安全操作符
简化空值检查:- // 空值合并
- $username = $_GET['user'] ?? 'guest';
- // 空安全操作符
- $street = $order?->customer?->address?->street;
- // 空值合并赋值
- $config['timeout'] ??= 30;
复制代码 使用 match 替代 switch
更简洁的条件分支:- $statusText = match ($statusCode) {
- 200, 201 => '成功',
- 400 => '错误请求',
- 404 => '未找到',
- 500 => '服务器错误',
- default => '未知状态',
- };
复制代码 使用箭头函数简化回调
- $prices = [12.5, 10.0, 3.5];
- $pricesWithTax = array_map(fn($price) => round($price * 1.11, 2), $prices);
复制代码 数组辅助函数
- // 从用户数组中提取邮箱
- $emails = array_column($users, 'email');
- // 按ID索引
- $indexedById = array_column($users, null, 'id');
- // 计算购物车总价
- $total = array_reduce($cart,
- fn($sum, $item) => $sum + $item['quantity'] * $item['price'],
- 0.0
- );
复制代码 使用 filter_var 验证输入
- $email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
- $ip = filter_var($_SERVER['REMOTE_ADDR'] ?? '', FILTER_VALIDATE_IP);
- if (!$email) { /* 处理邮箱格式错误 */ }
复制代码 安全的字符串处理
- // 去除空白字符
- $name = trim((string)($_POST['name'] ?? ''));
- // 安全比较(防止时序攻击)
- if (hash_equals($knownToken, $providedToken)) {
- // 验证通过,继续执行
- }
复制代码 使用 DateTimeImmutable 处理日期
- $timezone = new DateTimeZone('Asia/Shanghai');
- $now = new DateTimeImmutable('now', $timezone);
- // 计算两天后的上午9点
- $deliveryTime = $now->modify('+2 days')->setTime(9, 0);
复制代码 使用生成器处理大文件
- /**
- * 读取CSV文件生成器
- * @param string $filePath CSV文件路径
- * @return Generator 返回生成器,每次yield一行数据
- * @throws RuntimeException 当文件无法打开时抛出异常
- */
- function readCsvFile(string $filePath): Generator {
- $handle = fopen($filePath, 'r');
- if (!$handle) {
- throw new RuntimeException("无法打开文件: $filePath");
- }
-
- try {
- while (($row = fgetcsv($handle)) !== false) {
- yield $row;
- }
- } finally {
- fclose($handle);
- }
- }
- // 使用示例
- foreach (readCsvFile('/path/to/orders.csv') as [$id, $email, $amount]) {
- // 处理每一行数据
- }
复制代码 使用 PDO 预处理语句和事务
- // 数据库连接配置
- $dbConfig = [
- 'host' => 'localhost',
- 'dbname' => 'shop',
- 'charset' => 'utf8mb4',
- 'username' => 'username',
- 'password' => 'password'
- ];
- // 创建PDO实例
- $dsn = "mysql:host={$dbConfig['host']};dbname={$dbConfig['dbname']};charset={$dbConfig['charset']}";
- $pdo = new PDO($dsn, $dbConfig['username'], $dbConfig['password'], [
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 设置错误模式为异常
- PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 设置默认获取模式为关联数组
- PDO::ATTR_EMULATE_PREPARES => false, // 禁用预处理语句的模拟
- ]);
- $pdo->beginTransaction();
- try {
- $stmt = $pdo->prepare('INSERT INTO orders (email, amount) VALUES (:email, :amount)');
-
- foreach ($orders as $order) {
- $stmt->execute([
- ':email' => $order['email'],
- ':amount' => $order['amount']
- ]);
- }
-
- $pdo->commit();
- } catch (Throwable $e) {
- $pdo->rollBack();
- throw $e;
- }
复制代码 使用 Composer 自动加载
在 composer.json 中配置:- {
- "autoload": {
- "psr-4": {
- "App\": "src/"
- }
- }
- }
复制代码 运行 composer dump-autoload 使配置生效。
使用属性(PHP 8+)
- #[
- Attribute
- ]
- class Route {
- public function __construct(
- public string $method,
- public string $path
- ) {}
- }
- #[Route('GET', '/health-check')]
- function healthCheck(): array {
- return ['status' => '成功'];
- }
复制代码 使用 SPL 迭代器
- $dir = new RecursiveDirectoryIterator(__DIR__ . '/logs');
- $iterator = new RecursiveIteratorIterator($dir);
- foreach ($iterator as $path => $fileInfo) {
- if ($fileInfo->isFile() && str_ends_with($path, '.log')) {
- // 处理日志文件内容
- }
- }
复制代码 使用特定的异常类型
- /**
- * 订单未找到异常
- */
- class OrderNotFoundException extends RuntimeException {}
- function getOrder(PDO $db, int $orderId): array {
- $stmt = $db->prepare('SELECT * FROM orders WHERE id = :id');
- $stmt->execute([':id' => $orderId]);
- $row = $stmt->fetch();
-
- if (!$row) {
- throw new OrderNotFoundException("Order with ID $orderId not found");
- }
-
- return $row;
- }
复制代码 创建命令行脚本
[code]#!/usr/bin/env php |