我最近学到的一个很好的重构是利用有条件的类型。
多年来,我一直在进行if (!empty($posts))
,但是Rector是自动重构代码的工具,将其更改为if ($posts === [])
。使用$posts === []
的主要优点是它更明确,更容易出乎意料的行为。
这似乎并不多,但它说明了您正在使用的代码库。使用$posts === []
表明对细节的关注程度更高,并且承诺编写更可靠和可预测的代码。它表明您正在考虑代码的特定要求并采取步骤以确保其行为符合预期。
另一方面,使用!empty($posts)
可以提出一种更随意的编程方法,在该方法中,您依靠PHP的默认行为,而不是明确定义代码的预期行为。尽管对于较小的项目可能是可以接受的,但随着代码库的增长并变得更加复杂,它可能会导致意外的错误和困难。
这是我学到的其他一些重构,使我觉得自己负责代码,而不是围绕着代码。
使用严格的比较检查空字符串或空字符串:
// Before
if ($username == null) {}
if (!$username) {}
// After
if ($username === null) {}
前两个条件检查$user
是否不是真实的,其中包括检查它是null
,false
、0还是空字符串。在下一个示例中,我们可以使用严格的比较操作员===
专门检查$username
是否为null
。
类型提示功能参数:
function calculate(int $x, int $y) {
// Do something
}
在此示例中,int
类型提示确保$x
和$y
是整数。如果将非整数值传递给该函数,则PHP将抛出TypeError
。
使用array_key_exists()
检查数组键:
// Before
if (isset($data['username'])) {
// Do something
}
// After
if (array_key_exists('username', $data)) {
// Do something
}
在上面的示例中,我们使用isset()
函数来检查$userData['username']
是否存在。使用一个示例,我们可以使用array_key_exists()
函数专门检查'username'
密钥是否存在于$userData
中。
无效的运营商和无效的合并分配运营商:
// Before
if (isset($userData['username'])) {
$username = $userData['username'];
} else {
$username = 'Guest';
}
// After
$username = $userData['username'] ?? 'Guest';
在上面的示例中,我们使用if
语句来检查$userData['username']
是否存在并相应地设置$username
。在一个下一个示例中,我们可以使用Null合并运算符??
将$username
设置为$userData['username']
,如果存在,则'Guest'
如果不存在。此外,我们只能在尚未设置的情况下使用Null合并分配运算符??=
将默认值分配给$username
。
这些更严格的检查有助于我们编写更可靠和可预测的代码,尽早捕获错误,并使自己免于潜在的头痛。尽管其中一些重构可能需要一些习惯,但值得努力提高我们的代码质量。或者,只需安装校长,然后为您处理。愉快的编码!