聯合類型(Union Types)
可以聲明變量可能的類型,語法糖 = 雞肋,舊版本不聲明就是。
class Number { private int|float $number; public function setNumber(int|float $number): void { $this->number = $number; } public function getNumber(): int|float { return $this->number; } }
添加了 WeakMap
允許數組中的 key 放入對象(雞肋),$map[$obj] = 42;。
添加了 ValueError 類。
當函數或方法接收到具有正確類型的參數(錯誤類型應引發 TypeError 但值不合適時,將引發 ValueError 。
類的變更、使用
1、可變參數繼承(雞肋),允許
class A { public function method(int $many, string $parameters, $here) {} } class B extends A { public function method(...$everything) {} }
2、后期靜態綁定(LSB)(有用),對框架級別的封裝、一些工廠設計模式有用。RFC
class Test { public function create(): static { return new static(); } }
3、現在可以使用以下方法獲取對象的類名稱 RFC
$object::class. 等價 get_class($object).
4、現在,new 和 instanceof 可以與任意表達式一起使用,使用
new(expression)(... $args) 和 $obj instanceof(expression)。RFC
5、現在允許寫。RFC
Foo::BAR::$baz
6、添加 Stringable 接口(作用一般,用在視圖模板封裝)。RFC
只要類實現了__toString,那么這類自動實現了 Stringable 接口。
class Foo { public function __toString(): string { return 'foo'; } } function bar(Stringable $stringable) { /* 雖然Foo沒有實現Stringable,但是這里正常的。 */ } bar(new Foo()); bar('abc');
7、trait 現在可以定義抽象的私有方法。
現在可以將 throw 用作表達式。
原來的 throw 是語句,必須用例如 if 判斷后獨立拋出。(用處多)
// $value is non-nullable. $value = $nullableValue ?? throw new InvalidArgumentException(); 允許在參數列表中使用逗號結尾
雞肋中的雞肋,無用處
class Uri { private function __construct( ?string $scheme, ?string $user, ?string $pass, ?string $host, ?int $port, string $path, ?string $query, ?string $fragment // <-- ARGH! ) { ... }
}
現在可以編寫 catch(Exception)來捕獲異常而不將其存儲在變量中。RFC
如果用不到異常信息可以不設變變量,減少內存?
try { changeImportantData(); } catch (PermissionException) { echo "You don't have permission to do this"; }
增加了對混合類型 Mixed 的支持
這個 RFC 內容挺多的,建議進去看示例。
class A { public function foo(int $value) {} } class B extends A { // Parameter type was widened from int to mixed, this is allowed public function foo(mixed $value) {} }
增加了對注解 Annotations 的支持 RFC
這個功能應該期待很久了,多數用在配置,路由、事件、ORM 映射定義等等;很有用。
class Foo { <<ORM\Column(ORM\Column::T_INTEGER)>> protected $height; <<ExampleAttribute>> public function foo(<<ExampleAttribute>> $bar) { } }
添加了對構造函數屬性提升的支持(在構造函數簽名)。 RFC
語法糖,減少 Getters and Setters 代碼,說實話,這部分代碼還不如和 ide 開發商交涉,支持和 java 一樣快捷生成更好,還減少學習成本。有用處,但不重要,雞肋到普通之間。
// From: class Test { public function __construct(public Type $prop = DEFAULT) {} } // 等價於: class Test { public Type $prop; public function __construct(Type $prop = DEFAULT) { $this->prop = $prop; } }
即時(JIT)編譯器,屬於性能改進。
PHP7 就有了,但是沒有正式啟用和發布。PHP8 的 JIT 是一個比較重要的功能
大數據 & 密集計算,php 沒有生態,而且因為 php 不支持線程,是多進程模型並發的(在利用多核 cpu 時,無法共享對象 + 語柄資源),本身就不適合密集計算。
更多PHP內容請訪問:
騰訊T3-T4標准精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個台階(持續更新)