Php8在性能上有了一定的提升,接下来看一下对于7.x的版本迁移有那些需要注意的,新版本带来的新特性有哪些适用性。

新特性的介绍源于 php官方文档: Php8

named arguments

命名属性

推荐 好处不用多说了,语法能力提升,自然编程的自由度,便捷度也更好

这一项在面向对象语言中比较常见,类似于C++中的重载就允许实现类似的作用,但是C++的重载实现的能力更强一些,在swift中也是有类似的语法实现。 这个更新总体来说是预言特性上的补足,在7X版本中虽然IDE可以补充参数名显示,但是参数本身是有强制顺序的(如果写了最后一个参数,那么中间所有参数都必须补全),对于有写面向对象语言习惯的人来说这一点应该是比较实用,方便的。


function testArguments( $name, $age = 18, $gender = 1, $isStudent = false ){
}

// php7
// 如果中间两项都是默认,也必须提供参数(NULL)
testArguments( "jack", null, null, true );

// php8
// 可以直接跳过使用默认值的参数
testArguments( "jack", isStudent: true );

Attributes

属性?

也就是说以php官方提供的形式来进行文档注释

不推荐 phpDoc注释显然比官方提供的注释要臃肿,但可读性也更好,一味的简洁不太明智

Constructor property promotion

构造函数中定义属性?

从描述来看,其实是给了一个默认属性和构造函数简便的写法。

对比C++和swift来说,这个增强只能说聊胜于无,因为他并没有直接解决类属性的默认值问题。 而是把默认值的定义放在构造函数中,也就真的和官方说明一样,少写几个字而已。

Union types

联合类型

其实就是把本来由注释来声明的松散的类型问题在语言层面做了优化,其实放在php里面感觉有种多此一举,毕竟PHP里强类型到现在还是一个不彻底的革命,所以这个玩意儿和mixed类型放到一起,让人觉得这个语言有点自相矛盾了。

不推荐 偏好强类型的建议不要用了,真的有需求,自己写一个类吧。 偏好若类型的,恐怕你也用不上。

Match expression

match 表达式

ummm.... 由于match只支持单行表达式,所以match并不能取代switch 所以是一个严格匹配版加强版的字典匹配了。 不能说没用,也不能说很有用。

不推荐 这个真的不是把php字典类型改头换面出来凑数么? 哦,他加了一个严格检测。 所以是脱了裤子放屁?


// php官方示例

echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

echo ['8.0'=>"Oh no!","9.0"=>"what?"]["8.0"];
// > Oh no!

Nullsafe operator

空值操作符

这个我是在swift中第一次使用,十分的方便,并且在理解了 nullable 这个概念后在编程时也能感觉很多强类型语言中麻烦的问题有更便捷的解决方式。

不过放到PHP中由于所有值本身都是可以null的,所以nullable的的本质就不存在,这个更新主要为语法层面提供更简洁的实现。

推荐 代码少了,头发多了


// php7
$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();

    if ($address !== null) {
      $country = $address->country;
    }
  }
}

// php8
$country = $session?->user?->getAddress()?->country;

总体而言,php8没有给我太大的惊喜,在我看来称之为 php7.5 也是没问题的。

文章地址:




标签: none

添加新评论