请纠正这5个PHP编码小陋习
在做过大量的代码审查后,我经常看到一些重复的错误,以下是纠正这些错误的方法。
在循环之前测试数组是否为空
1 2 3 4 5 6 7 | $items = []; // ... if ( count ( $items ) > 0) { foreach ( $items as $item ) { // process on $item ... } } |
foreach
以及数组函数 (array_*
) 可以处理空数组。
- 不需要先进行测试
- 可减少一层缩进
1 2 3 4 5 | $items = []; // ... foreach ( $items as $item ) { // process on $item ... } |
将代码内容封装到一个 if 语句汇总
1 2 3 4 5 6 7 | function foo(User $user ) { if (! $user ->isDisabled()) { // ... // long process // ... } } |
这不是 PHP 特有的情况,不过我经常碰到此类情况。你可以通过提前返回来减少缩进。
所有主要方法处于第一个缩进级别
1 2 3 4 5 6 7 8 9 | function foo(User $user ) { if ( $user ->isDisabled()) { return ; } // ... // 其他代码 // ... } |
多次调用 isset 方法
你可能遇到以下情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $a = null; $b = null; $c = null; // ... if (!isset( $a ) || !isset( $b ) || !isset( $c )) { throw new Exception( "undefined variable" ); } // 或者 if (isset( $a ) && isset( $b ) && isset( $c ) { // process with $a, $b et $c } // 或者 $items = []; //... if (isset( $items [ 'user' ]) && isset( $items [ 'user' ][ 'id' ]) { // process with $items['user']['id'] } |
我们经常需要检查变量是否已定义,php 提供了 isset 函数可以用于检测该变量,而且该函数可以一次接受多个参数,所以一下代码可能更好
$a = null; $b = null; $c = null; // ... if (!isset($a, $b, $c)) { throw new Exception("undefined variable"); } // 或者 if (isset($a, $b, $c)) { // process with $a, $b et $c } // 或者 $items = []; //... if (isset($items['user'], $items['user']['id'])) { // process with $items['user']['id'] }
echo 和 sprintf 方法一起使用
1 2 | $name = "John Doe" ; echo sprintf( 'Bonjour %s' , $name ); |
看到这段代码你可能会想笑,不过我的确这样写了一段时间,而且我仍然会看到很多这样写的!其实echo
和sprintf
并不需同时使用,printf
就可以完全实现打印功能。
1 2 | $name = "John Doe" ; printf( 'Bonjour %s' , $name ); |
通过组合两种方法检查数组中是否存在键
1 2 3 4 5 6 7 8 | $items = [ 'one_key' => 'John' , 'search_key' => 'Jane' , ]; if (in_array( 'search_key' , array_keys ( $items ))) { // process } |
我经常看到的最后一个错误是in_array
和array_keys
的联合使用。所有这些都可以使用array_key_exists
替换。
1 2 3 4 5 6 7 8 | $items = [ 'one_key' => 'John' , 'search_key' => 'Jane' , ]; if ( array_key_exists ( 'search_key' , $items )) { // process } |
我们还可以使用isset
来检查值是否不是null
。
1 2 3 | if (isset( $items [ 'search_key' ])) { // process } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-11-06 PHP中高级面试题 一个高频面试题:怎么保证缓存与数据库的双写一致性?
2019-11-06 PHP Swoole-Demo TCP服务端简单实现
2019-11-06 如何基于 PHP-X 快速开发一个 PHP 扩展
2019-11-06 Mysql主从同步的实现原理与配置实战
2019-11-06 PHP 高级面试115题汇总(含答案)