PHP8的这4个新特性可能让你写出更差劲的代码

2022-12-20 奥古斯宏

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,那么联合类型可能会很好用,但此时你应该拆分代码而不是添加更多奇怪的类型。你可以在团队中执行严格的代码规范,联合类型不要超过两个类型。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

混合类型

这可能是最好的,也可以是最坏的东西。如果我们认为联合类型不够好,那么混合类型就是彻底的糟糕的用法。


public function __construct(
    private mixed $number
  ) {}

相当于使用一个非常复杂的联合类型 。

public function __construct(
    private array|bool|callable|int|float|null|object|resource|string $number
  ) {}

结尾

如果我们查看PHP开发人员的RFC,我们会看到PHP开发者们是如何努力的了解新特性,以及为什么要添加这些新特性。但仍然,我们会看到有很多的开发人员会滥用这些特性。

总的来说,PHP8增加了一些危险的特性,可能会让缺乏开发经验的开发人员使用差劲的做法。

但仍然,对于新手来说,可能会有一些坑,但如果你有足够的经验,这些都是很棒的特性。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

不过这只是一些特新的糟糕用法的例子,并不能说PHP变得更差劲了。任何语言都能找到这样的例子。

但是换一种思维,语言应该更灵活,如何写出更好的代码,是程序员的责任,而不是“语言的责任”。因此不是PHP允许编写差劲的代码,而是每个人都有错误的使用习惯。

PHP是用户驱动的语言,因此PHP开发者们,是在实现市场需要的功能。不过PHP的开发者也应当对PHP的发展有一个明确的方向和思路。如此灵活的用法,可能会让更多的人的编码风格变得更不同,可能会影响到语言的凝聚力。

参考原文: https://medium.com/efesent-solutions/5-new-features-in-php-8-that-promote-bad-practices-6b74ce40d2f2
最近浏览
IP用户:101.67.*.*
1 天前 Generic Bot
IP用户:66.249.*.*
1 天前 Googlebot
IP用户:116.179.*.*
2 天前 Baidu Spider
IP用户:123.245.*.*
3 天前 Go-http-client
IP用户:85.208.*.*
3 天前 Semrush Bot
IP用户:66.249.*.*
4 天前 Googlebot
IP用户:110.154.*.*
8 天前 Go-http-client
IP用户:14.155.*.*
8 天前 Chrome Windows 10
IP用户:54.36.*.*
11 天前 aHrefs Bot
IP用户:112.13.*.*
11 天前 Generic Bot
IP用户:34.64.*.*
12 天前 Googlebot
IP用户:34.64.*.*
12 天前 Googlebot
累计浏览次数:954
评论
点击登录
phpreturn,PHP武器库,专注PHP领域的项目和资讯,收录和介绍PHP相关项目。
最近浏览 点击登录
累计浏览次数:104284
一周浏览次数:2731
今日浏览次数:354

本站所有权利归 phpreturn.com 所有

举报/反馈/投稿邮箱:phpreturn@ulthon.com

鲁ICP备19027671号-2