找回密码
 立即注册
首页 业界区 业界 PHP 15 个高效开发的小技巧

PHP 15 个高效开发的小技巧

颜清华 4 小时前
PHP 15 个高效开发的小技巧

在 PHP 开发中,你不需要依赖新框架也能显著提升效率。真正有用的是那些能节省时间、减少重复工作的小技巧。本文将介绍一些简单但强大的 PHP 技巧,帮助你编写更简洁、更健壮的代码。
原文链接-PHP 15 个高效开发的小技巧
让类型系统为你保驾护航
  1. declare(strict_types=1);
  2. function calculatePriceWithTax(float $price, float $taxRate): float {
  3.     return $price * (1 + $taxRate);
  4. }
复制代码
优势:类型错误会立即显现,而不是在后期才出现并难以追踪。
使用空值合并和空安全操作符

简化空值检查:
  1. // 空值合并
  2. $username = $_GET['user'] ?? 'guest';
  3. // 空安全操作符
  4. $street = $order?->customer?->address?->street;
  5. // 空值合并赋值
  6. $config['timeout'] ??= 30;
复制代码
使用 match 替代 switch

更简洁的条件分支:
  1. $statusText = match ($statusCode) {
  2.     200, 201 => '成功',
  3.     400      => '错误请求',
  4.     404      => '未找到',
  5.     500      => '服务器错误',
  6.     default  => '未知状态',
  7. };
复制代码
使用箭头函数简化回调
  1. $prices = [12.5, 10.0, 3.5];
  2. $pricesWithTax = array_map(fn($price) => round($price * 1.11, 2), $prices);
复制代码
数组辅助函数
  1. // 从用户数组中提取邮箱
  2. $emails = array_column($users, 'email');
  3. // 按ID索引
  4. $indexedById = array_column($users, null, 'id');
  5. // 计算购物车总价
  6. $total = array_reduce($cart,
  7.     fn($sum, $item) => $sum + $item['quantity'] * $item['price'],
  8.     0.0
  9. );
复制代码
使用 filter_var 验证输入
  1. $email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
  2. $ip = filter_var($_SERVER['REMOTE_ADDR'] ?? '', FILTER_VALIDATE_IP);
  3. if (!$email) { /* 处理邮箱格式错误 */ }
复制代码
安全的字符串处理
  1. // 去除空白字符
  2. $name = trim((string)($_POST['name'] ?? ''));
  3. // 安全比较(防止时序攻击)
  4. if (hash_equals($knownToken, $providedToken)) {
  5.     // 验证通过,继续执行
  6. }
复制代码
使用 DateTimeImmutable 处理日期
  1. $timezone = new DateTimeZone('Asia/Shanghai');
  2. $now = new DateTimeImmutable('now', $timezone);
  3. // 计算两天后的上午9点
  4. $deliveryTime = $now->modify('+2 days')->setTime(9, 0);
复制代码
使用生成器处理大文件
  1. /**
  2. * 读取CSV文件生成器
  3. * @param string $filePath CSV文件路径
  4. * @return Generator 返回生成器,每次yield一行数据
  5. * @throws RuntimeException 当文件无法打开时抛出异常
  6. */
  7. function readCsvFile(string $filePath): Generator {
  8.     $handle = fopen($filePath, 'r');
  9.     if (!$handle) {
  10.         throw new RuntimeException("无法打开文件: $filePath");
  11.     }
  12.    
  13.     try {
  14.         while (($row = fgetcsv($handle)) !== false) {
  15.             yield $row;
  16.         }
  17.     } finally {
  18.         fclose($handle);
  19.     }
  20. }
  21. // 使用示例
  22. foreach (readCsvFile('/path/to/orders.csv') as [$id, $email, $amount]) {
  23.     // 处理每一行数据
  24. }
复制代码
使用 PDO 预处理语句和事务
  1. // 数据库连接配置
  2. $dbConfig = [
  3.     'host'      => 'localhost',
  4.     'dbname'    => 'shop',
  5.     'charset'   => 'utf8mb4',
  6.     'username'  => 'username',
  7.     'password'  => 'password'
  8. ];
  9. // 创建PDO实例
  10. $dsn = "mysql:host={$dbConfig['host']};dbname={$dbConfig['dbname']};charset={$dbConfig['charset']}";
  11. $pdo = new PDO($dsn, $dbConfig['username'], $dbConfig['password'], [
  12.     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,  // 设置错误模式为异常
  13.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,        // 设置默认获取模式为关联数组
  14.     PDO::ATTR_EMULATE_PREPARES   => false,                   // 禁用预处理语句的模拟
  15. ]);
  16. $pdo->beginTransaction();
  17. try {
  18.     $stmt = $pdo->prepare('INSERT INTO orders (email, amount) VALUES (:email, :amount)');
  19.    
  20.     foreach ($orders as $order) {
  21.         $stmt->execute([
  22.             ':email' => $order['email'],
  23.             ':amount' => $order['amount']
  24.         ]);
  25.     }
  26.    
  27.     $pdo->commit();
  28. } catch (Throwable $e) {
  29.     $pdo->rollBack();
  30.     throw $e;
  31. }
复制代码
使用 Composer 自动加载

在 composer.json 中配置:
  1. {
  2.   "autoload": {
  3.     "psr-4": {
  4.       "App\": "src/"
  5.     }
  6.   }
  7. }
复制代码
运行 composer dump-autoload 使配置生效。
使用属性(PHP 8+)
  1. #[
  2.     Attribute
  3. ]
  4. class Route {
  5.     public function __construct(
  6.         public string $method,
  7.         public string $path
  8.     ) {}
  9. }
  10. #[Route('GET', '/health-check')]
  11. function healthCheck(): array {
  12.     return ['status' => '成功'];
  13. }
复制代码
使用 SPL 迭代器
  1. $dir = new RecursiveDirectoryIterator(__DIR__ . '/logs');
  2. $iterator = new RecursiveIteratorIterator($dir);
  3. foreach ($iterator as $path => $fileInfo) {
  4.     if ($fileInfo->isFile() && str_ends_with($path, '.log')) {
  5.         // 处理日志文件内容
  6.     }
  7. }
复制代码
使用特定的异常类型
  1. /**
  2. * 订单未找到异常
  3. */
  4. class OrderNotFoundException extends RuntimeException {}
  5. function getOrder(PDO $db, int $orderId): array {
  6.     $stmt = $db->prepare('SELECT * FROM orders WHERE id = :id');
  7.     $stmt->execute([':id' => $orderId]);
  8.     $row = $stmt->fetch();
  9.    
  10.     if (!$row) {
  11.         throw new OrderNotFoundException("Order with ID $orderId not found");
  12.     }
  13.    
  14.     return $row;
  15. }
复制代码
创建命令行脚本

[code]#!/usr/bin/env php

相关推荐

您需要登录后才可以回帖 登录 | 立即注册