摘要:PHP8已經(jīng)正式發(fā)布3個多月了,這對PHP來說是一個重大版本,這個版本中有很多新功能,例如聯(lián)合類型、命名參數(shù)、Match表達式、Nullsafe空安全運算符、類的反射...
PHP8已經(jīng)正式發(fā)布3個多月了,本想早早研究一下新版本的特性,不過近期太忙了,這幾天才抽空研究了一下。
由于重大更改,您需要在代碼中進行一些更改才能在 PHP8 中運行。但是,如果您已經(jīng)跟上最新版本,升級應(yīng)該不會太難,因為大多數(shù)重大更改以前在 PHP7 版本中已棄用。
1.聯(lián)合類型
考慮到 PHP 動態(tài)語言類型的特性,現(xiàn)在很多情況下,聯(lián)合類型都是很有用的。聯(lián)合類型是兩個或者多個類型的集合,表示可以使用其中任何一個類型。
function show(int|string $a):int|string{ var_dump($a); return 5; } echo show('yzmcms');
請注意,聯(lián)合類型中不包含void,因為void表示的含義是 “根本沒有返回值”,另外PHP7.1支持了null類型,但已被PHP8中的?代替,例如:
//PHP7中的寫法 function show(string|null $a){ var_dump($a); } //PHP8中的寫法: function show(?string $a){ var_dump($a); }
2.命名參數(shù)
命名參數(shù)允許您通過指定值名稱將值傳遞給函數(shù),這樣您就不必考慮它們的順序,還可以跳過可選參數(shù)!
function foo(string $a, string $b, ?string $c = null, ?string $d = null) { var_dump($a); var_dump($b); var_dump($d); } foo( b: 'value b', a: 'value a', d: 'value d', );
3.Match表達式
與switch比較類似,你可以稱它為switch表達式的大哥:match可以返回值,不需要break語句,可以組合條件,使用嚴(yán)格的類型比較,并且不執(zhí)行任何類型的強制。
PHP7中的寫法:
$statusCode = 500; switch ($statusCode) { case 200: case 300: $message = null; break; case 400: $message = 'not found'; break; case 500: $message = 'server error'; break; default: $message = 'unknown status code'; break; } var_dump($message); //server error
PHP8中的寫法:
$statusCode = 500; $message = match ($statusCode) { 200, 300 => null, 400 => 'not found', 500 => 'server error', default => 'unknown status code', }; var_dump($message); //server error
4. 構(gòu)造函數(shù)屬性提升
PHP7中的寫法:
class user{ public string $name; public string $email; public function __construct(string $name, string $email) { $this->name = $name; $this->email = $email; } public function get_attribute(){ var_dump($this->name); var_dump($this->email); } } $test = new user('yuanzhimeng', 'yzmcms@qq.com'); $test->get_attribute();
PHP8中的寫法:
class user{ public function __construct(public string $name, public string $email) { } public function get_attribute(){ var_dump($this->name); var_dump($this->email); } } $test = new user('yuanzhimeng', 'yzmcms@qq.com'); $test->get_attribute();
5.Nullsafe空安全運算符
常用于類中屬性和方法返回值.
?->
如果全等于NULL則斷開并返回NULL,如果不全等于NULL則往后繼續(xù)執(zhí)行,這個特性會非常高效的解決代碼的冗余。
在PHP7中,有時會存在類屬性多條件的判斷,如下代碼:
class Person{ public $user; public $country; public function __construct(){ $this->user = $this; $this->country='yes'; } public function getAddress(){ return $this; } } $session=new Person(); if($session!==null){ $user = $session->user; if($user!==null){ $address = $user->getAddress(); if($address!=null){ $country = $address->country; if($country!==null){ var_dump($country); } } } }
以上代碼返回結(jié)果為string(3) "yes"
但是在PHP8中就完美的解決了這種代碼冗余的問題:
class Person{ public $user; public $country; public function __construct(){ $this->user = $this; $this->country='yes'; } public function getAddress(){ return $this; } } $session=new Person(); echo $session?->user?->getAddress()?->country;
6. Reflection反射
反射類的 3 個方法簽名已變更:
ReflectionClass::newInstance($args); ReflectionFunction::invoke($args); ReflectionMethod::invoke($object, $args);
現(xiàn)在已變成:
ReflectionClass::newInstance(...$args); ReflectionFunction::invoke(...$args); ReflectionMethod::invoke($object, ...$args);
升級指南指定,如果要擴展這些類,并且仍想同時支持 PHP 7 和 PHP 8,則允許以下簽名:
ReflectionClass::newInstance($arg = null, ...$args); ReflectionFunction::invoke($arg = null, ...$args); ReflectionMethod::invoke($object, $arg = null, ...$args);
7.注釋
方法注釋使用:
/** * this is show function */ function show($name) { echo $name; }
類注解類使用:
$ref = new ReflectionFunction("show"); echo $doc = $ref->getDocComment(); #[Attribute(Attribute::TARGET_CLASS)] class MyAttr{ public function __construct($name, $value) { echo "$name,$value"; } } #[MyAttr("api","http://www.yzmcms.com/api")] class Person{} $ref = new ReflectionClass("Person"); $ref->getAttributes("MyAttr")[0]->newInstance();
網(wǎng)友評論:
學(xué)到了學(xué)到了
2021-04-08 20:30:27 回復(fù)
網(wǎng)友評論:
滿滿的干貨,收藏了
2021-03-20 21:17:45 回復(fù)