PHP 15 个高效开发的小技巧

news/2025/10/12 8:52:44/文章来源:https://www.cnblogs.com/catchadmin/p/19136248

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;
}

创建命令行脚本

#!/usr/bin/env php
<?php
declare(strict_types=1);$options = getopt('', ['path:']);
$filePath = $options['path'] ?? 'input.csv';foreach (readCsvFile($filePath) as $row) {// 处理每一行
}

实战示例:CSV 导入数据库

$db->beginTransaction();
$stmt = $db->prepare('INSERT INTO orders (id, email, amount, created_at) VALUES (:id, :email, :amount, :created_at)');$batch = 0;foreach (readCsvFile('orders.csv') as $lineNumber => $row) {if ($lineNumber === 0) continue; // 跳过CSV文件的标题行[$id, $email, $amount, $createdAt] = $row;// 数据验证$email = filter_var($email, FILTER_VALIDATE_EMAIL);$amount = is_numeric($amount) ? (float)$amount : null;if (!$email || $amount === null) {// 记录无效数据行error_log("第 {$lineNumber} 行数据无效: " . json_encode($row));continue;}// 日期时间格式化$timezone = new DateTimeZone('Asia/Shanghai');$createdAt = (new DateTimeImmutable($createdAt, $timezone))->format('Y-m-d H:i:s');// 执行数据库插入$stmt->execute([':id' => (int)$id,':email' => $email,':amount' => $amount,':created_at' => $createdAt,]);// 每处理1000条记录提交一次事务if ((++$batch % 1000) === 0) {$db->commit();$db->beginTransaction();}
}$db->commit();

总结

这些技巧可以帮助你:

  1. 编写更健壮的代码
  2. 提高开发效率
  3. 处理大数据量时保持低内存占用
  4. 使代码更易于维护

选择几个最符合你工作流程的技巧开始使用,逐步将它们融入你的日常开发中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI元人文构想研究:人类拥抱AI的文明新范式

AI元人文构想研究:人类拥抱AI的文明新范式 摘要:本文提出"AI元人文"理论构想,旨在回应人工智能时代技术与人文价值深度融合的文明需求。该构想基于"价值能量系统"理论模型,通过"悟空之眼…

华为发布星河AI广域网解决方案,四大核心能力支撑确定性网络 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【汇编】汇编语言运行过程

【汇编】汇编语言运行过程 汇编的运行分为以下三个步骤:编辑源程序 汇编源程序及连接源程序 运行.exe文件1. 编辑源程序 利用编辑器编辑源程序,文件扩展名为.ASM。 2. 汇编源程序 汇编语言源程序可使用下列简化命令进…

设计模式与原则精要 - 详解

设计模式与原则精要 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

电感式传感器 - 实践

电感式传感器 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

云栖2025 | 阿里云自研大素材平台 ODPS 重磅升级:全面支持AI计算和服务

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CSP-J/S2024第二轮提高级题目知识构成分析报告

CSP-J/S2024第二轮提高级题目知识构成分析报告CCF ​已认证机构号本报告基于《全国青少年信息学奥林匹克系列竞赛大纲(2023 年修订版)》,对CSP-S2024四道题目展开分析,涵盖知识点、难度系数及选手能力要求,最后对…

浅层 CNN 的瓶颈:用 LeNet 实测不同数据集

本实验旨在评估 LeNet 卷积神经网络 在不同复杂度数据集上的表现,以验证其泛化能力与局限性。我们选择了三个典型数据集: • MNIST:2828 灰度手写数字,任务简单、类内差异小; • Fashion-MNIST:2828 灰度服饰图像…

文本派 - 停服公告 2025

文本派 - 极简在线文本存储 停服通知根据相关部门和监管要求,需要对存储在云端的数据进行合法性审查。由于“文本派”采用前端加密模式,我们无法解密用户数据以排查潜在滥用情况。经内部充分讨论并遵循监管要求,我们…

lCode题库

https://c.icode.org.cn/wrc_learn

Arista cEOS 4.35.0F 发布 - 针对云原生环境设计的容器化网络操作系统

Arista cEOS 4.35.0F 发布 - 针对云原生环境设计的容器化网络操作系统Arista cEOS 4.35.0F 发布 - 针对云原生环境设计的容器化网络操作系统 Containerized EOS 数据中心网络操作系统 请访问原文链接:https://sysin.o…

Arista vEOS 4.35.0F 发布 - 虚拟化的数据中心和云网络可扩展操作系统

Arista vEOS 4.35.0F 发布 - 虚拟化的数据中心和云网络可扩展操作系统Arista vEOS 4.35.0F 发布 - 虚拟化的数据中心和云网络可扩展操作系统 Virtual EOS 数据中心网络操作系统 请访问原文链接:https://sysin.org/blo…

因果机器学习的技术发展与挑战

本文深入探讨因果机器学习这一新兴领域,涵盖因果发现、可解释AI、公平性算法等关键技术议题,分析图形模型与统计方法在因果推断中的应用,并展望该领域的未来发展方向与数学工具演进。ICML:因果遇见机器学习之地 某…

深入解析:Spring依赖注入方式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CSP-S 考前集训

10.8-10.9: whk 10.10 专题。 CF1798E Multitest Generator:直接做就行,发现答案至多为 \(2\)。 CF2066C Bitwise Slides:我们维护那两个相同的数,再 dp。 CF431D Random Task:发现答案满足单调性,可以二分+数位…

通过rqlite sdk 快速访问sqlite-vec

通过rqlite sdk 快速访问sqlite-vecsqlite-vec 的的轻量化以及标准sqlite 扩展的模式对于需要使用向量存储的场景(比如相似比较的),但是使用上可能并不是很友好(从轻量化来说够用了,但是我们很多时候还是需要serv…

Arista EOS 4.35.0F 发布 - 适用于下一代数据中心和云网络的可扩展操作系统

Arista EOS 4.35.0F 发布 - 适用于下一代数据中心和云网络的可扩展操作系统Arista EOS 4.35.0F 发布 - 适用于下一代数据中心和云网络的可扩展操作系统 EOS 数据中心网络操作系统 请访问原文链接:https://sysin.org/b…

CSharp: itextsharp5 imge converter pdf

using iTextSharp.text; using iTextSharp.text.pdf; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Web; using System.Web.UI; using …

20251011 总结

P9870 [NOIP2023] 双序列拓展 首先有一个暴力做法。 翻译一下题意,即为:拓展也就是一个DP,我们设朴素DP,每次判断能否往下拓展,设fij表示x匹配到第i位,y匹配到第j位。 然后考虑特殊性质:也就是说,这个特殊性质…

上课讲的部分 qoj 题记录

上课讲的部分 qoj 题记录上课讲的部分 qoj 题记录 #6299. Binary String