PHP8已经发布快两年多了,这个版本为PHP带来了大量的新功能。近年来,PHP大大提高了性能,并强化对OOP(面向对象程序设计)的使用,但仍然,PHP中也有很多值得慎重的考虑的用法。新版本有很多好的特性,比如JIT编译器,他可以提高性能、提升构造函数属性、结构化元数据。但其中也有一些新功能,会助长不良的代码编写,以下是五个不良做法和例子。
空安全运算符
该运算符能够在复杂的逻辑判断中,节省大量的代码。它很容易理解:如果链式调用中的某些内容为空,则直接返回为空。它能够节省精力和代码行数,避免了复杂的调用。在其它编程语言中也有这种用法,比如:JavaScript、C#。但这个用法怎么会变差劲呢?
/** PHP 7 */
$country = null;if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}/** PHP 8 */
$country = $session?->user?->getAddress()?->country;
在上面的例子中,空运算符被过度的使用了,等需要调试的时候,你就不知道具体哪个东西才是Null,为此可能需要付出更多的精力去追踪问题:到底那个是Null?是session?user?getAddress方法?还是country。
那应该如何避免掉进坑里呢?也有很多办法:
- 尽可能使定义类型,如果你知道某个变量不能为空,则应当为它声明类型。
- 限制空安全运算符的链式调用次数,比如最多两次。
- 用健全的代码处理Null的情况,尽可能防止调用空安全运算符
命名参数
一个方法最多应该定义几个参数呢?我们在写代码的时候,会向方法里添加越来越多的参数,每个人都会轻易的的这样做。有新的逻辑?直接增加一个参数,然后用if判断一下就可以了。但这是最糟糕的做法。比较好的做法是,把这些参数封装在对象中。所以我们可以在团队中做个规定,最多传入三个参数,超过三个则必须定义在对象中。在PHP8中,添加了命名参数的特性,这样,增加更多的参数会更方便,开发人员可能更不愿意通过对象传递参数(可以通过getter或setter方法或断言验证参数),而是试图添加一个新的参数。如果没有严格的标准,方法的迭代就有可能提高代码的复杂性。为了防止这种情况:
- 在团队中定义代码规范,严格限制参数数量
- 始终将参数和逻辑封装在对象中
联合类型
在新的版本中,PHP朝着更严格的类型化方向发展。表明他正在变得成熟,并且抛弃一些不良的行为和做法。 命名空间、特征、标量类型声明、返回类型声明、匿名类等,都表明了这一点。 联合类型随之而来:
public function __construct(
private int|float|string|null $number
) {}
但是这有可能是PHP8中最糟糕的功能之一。它明显的降低了接口的实践。它并没有强制开发人员创建有抽象思维的接口,而是让他们随意的发挥。联合类型可能会使一些情况变得更好,但似乎场景并不多。如果你打算将老的程序迁移到PHP8,那么联合类型可能会很好用,但此时你应该拆分代码而不是添加更多奇怪的类型。你可以在团队中执行严格的代码规范,联合类型不要超过两个类型。
混合类型
这可能是最好的,也可以是最坏的东西。如果我们认为联合类型不够好,那么混合类型就是彻底的糟糕的用法。
public function __construct(
private mixed $number
) {}
相当于使用一个非常复杂的联合类型 。
public function __construct(
private array|bool|callable|int|float|null|object|resource|string $number
) {}
结尾
如果我们查看PHP开发人员的RFC,我们会看到PHP开发者们是如何努力的了解新特性,以及为什么要添加这些新特性。但仍然,我们会看到有很多的开发人员会滥用这些特性。
总的来说,PHP8增加了一些危险的特性,可能会让缺乏开发经验的开发人员使用差劲的做法。
但仍然,对于新手来说,可能会有一些坑,但如果你有足够的经验,这些都是很棒的特性。
不过这只是一些特新的糟糕用法的例子,并不能说PHP变得更差劲了。任何语言都能找到这样的例子。
但是换一种思维,语言应该更灵活,如何写出更好的代码,是程序员的责任,而不是“语言的责任”。因此不是PHP允许编写差劲的代码,而是每个人都有错误的使用习惯。
PHP是用户驱动的语言,因此PHP开发者们,是在实现市场需要的功能。不过PHP的开发者也应当对PHP的发展有一个明确的方向和思路。如此灵活的用法,可能会让更多的人的编码风格变得更不同,可能会影响到语言的凝聚力。
参考原文: https://medium.com/efesent-solutions/5-new-features-in-php-8-that-promote-bad-practices-6b74ce40d2f2
原文标题:PHP8的这4个新特性可能让你写出更差劲的代码
原文地址:https://phpreturn.com/index/a63a10f794b0d8.html
原文平台:PHP武器库
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。