当前位置: 首页 > news >正文

这几个编码小技巧将令你 PHP 代码更加简洁

image.png

保持代码简洁和高可读性远远要比我们想象的要难,有时候甚至比持续架构设计都要难。这里收集了一些可能对你重构代码有用的 代码片段 供大家参考。

数组转化

我们常常需要在一个函数里面接受一个支持字符串或者数组类型数据的参数。可以使用适当的类型转化方式将字符串类型转化成数组类型,来取代类型检测。

// 没有类型转化
$param = is_array($param) ? $param : [$param];
array_map(function ($item) {
    //
}, $param);

// 使用类型转化
array_map(function ($item) {
    //
}, (array) $param);

当然这看起来没什么区别,只是节省了一行代码而已。但是你可以设想一下,当你使用复杂的循环结构或者嵌套数组处理大量数据时。这样做将会有意义,它能使代码保持简洁。

类型检测

类型检测也是一种让代码简洁的小技巧。一个小的类型检测可以为你节省几行代码,同时可以使参数具有一些灵活性。

public function scopeOfTeam($query, $team) {
    $team = $team instanceof Team ? $team->id : $team;

    return $query->where('team_id', $team);
}

在这个例子中,我们可以使用一个表达式在一行中进行类型检测,所以我们不需要到处使用 if-else 语句。同时这样函数就可以接收 Team 类型或 int 型两种类型的数据了。

重构长 If 语句

有时候,在执行动作之前我们需要做一些条件检查。但是,随着我们的应用的持续增长,if 语句会变得越来越长。所以,我们需要考虑重构。一个小例子:

// 与其这样
if ($a === 'val_1' || $a === 'val_2' || $a === 'val_3') {
    // 执行动作
}

// 不如这样
if (in_array($a, ['val_1', 'val_2', 'val_3'])) {
    // 执行方法
}

注意,第一个例子运行方式与第二个有一些不同。第一个例子中,只要有一个条件为真,则后面的条件就会被忽略,在一些情况下,它会更快。谢谢 Zois Pag 的建议。

这两个例子的结果是一样的,但是第二个更整洁。我们可以不再使用 || 操作符,并且只引用了 $a 变量一次。

去掉不必要的 if 语句

一个普遍的错误,我们会经常性的过度使用 if-else 语句。当然,有些时候它是不可省略的,但也有些情况,我们不需要用到它。

// 之前这样用
if ($a === 'b') {
    return true;
} else {
    return false;
}

// 现在可以这样
return $a === 'b';

但是逻辑颠倒了怎么办? 那么, 如果条件是 true 我们又想返回 false 该怎么办? 当然,在 if 语句中,我们仅需要相反的 true 和 false ,但是在重构的版本中,我们会有一个相对轻松的工作。只需要在你验真假的时候加上 ! 运算符。它将返回颠倒后的结果。

总结

每天我们都能发现一些充满了过度复杂逻辑的方案和代码,长期来看,这对开发者和产品本身都不好。上文中,我们只是尝试搜集了一些例子,在这些例子里,你只需做出一点小的努力,就可以让你的代码变得更好更简洁。

讨论请前往社区: https://laravel-china.org/top...

相关文章:

  • 技术相对论之软件架构
  • Fragment 生命周期怎么来的?
  • Redis和Memcache和MongoDB简介及区别分析(整理)
  • ubuntu16.4安装最新版wine3.0
  • c++中局部变量初始化的问题
  • WordCount
  • 外卖也智能!美团骑手智能助手的技术与实践
  • 【协议转换和消息路由】camel-spring-boot-starter 实践
  • 坑货!阿里奇门中心
  • [ssh]如何设计ARM板上多用户key登录系统
  • 71. Simplify Path
  • numpy 数组运算
  • Java 选择排序selection sort
  • 磁盘管理
  • 利用SCVMM 2012 R2来管理Azure虚拟机
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • React-flux杂记
  • Spring Boot快速入门(一):Hello Spring Boot
  • 电商搜索引擎的架构设计和性能优化
  • 机器学习中为什么要做归一化normalization
  • 如何在 Tornado 中实现 Middleware
  • 优化 Vue 项目编译文件大小
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 阿里云服务器购买完整流程
  • 回归生活:清理微信公众号
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (52)只出现一次的数字III
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (七)Java对象在Hibernate持久化层的状态
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)mysql_MYSQL(三)
  • (转)3D模板阴影原理
  • (转)ObjectiveC 深浅拷贝学习
  • *** 2003
  • ***利用Ms05002溢出找“肉鸡
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .describe() python_Python-Win32com-Excel
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Micro Framework初体验(二)
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET的数据绑定
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @Autowired和@Resource的区别
  • @Data注解的作用
  • [<MySQL优化总结>]
  • [20190113]四校联考
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [ESP32 IDF]web server
  • [ListView.View=List]的垂直滚动条
  • [NOIP 2003] 栈(三种方法:DP、数论、搜索)
  • [one_demo_4]不使用第3个变量交换两个变量的值