国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP7.1新功能之Nullable Type用法分析

2024-05-04 23:50:30
字體:
來源:轉載
供稿:網友

本文實例分析了PHP7.1新功能之Nullable Type用法。分享給大家供大家參考,具體如下:

在 PHP5 時代,PHP 的參數已經支持 type hint(除了基本類型),想必大家應該很熟悉;后來 PHP7 時代來臨,PHP 也可以指定返回值的類型(以及基本類型的 type hint)。但我們可能還有一種需求:除了指定的 type hint,參數或者返回值也能定義可以為 null,舉個例子,假如我們有一個 UserRepository 類,有一個方法叫 find($id),此方法可返回一個 User 對象,也可返回 null,在 PHP7.1 里就可以這么定義了:
...

class UserRepository{  ...  public function find($id): ?User  {    ...    return $user;    // or    // return null;  }}

但這么申明以后,如果返回 null,是否必須顯式調用 return null,這就得等 7.1 正式出來之后再驗證了。

當然還有參數設定是否 nullable 的例子,直接復制官網里的例子:

function say(?string $msg) {  if ($msg) {    echo $msg;  }}say('hello'); // ok -- prints hellosay(null); // ok -- does not printsay(); // error -- 丟失屬性say(new stdclass); //error -- 類型錯誤

以上便是 nullable type 的大致用法,但其實引入了此種機制以后,有很多細節都是需要注意的,比如在繼承的時候,子類允許去掉父類同名方法的返回類型為 nullable 的設置:

interface Fooable{  public function foo(): ?Fooable;}interface StrictFooable extends Fooable{  public function foo(): Fooable; // valid}

但反過來,子類是不允許添加返回類型可以為 nullable 的。

然后我們再來看看參數類型的情況。跟返回類型相反,子類在復寫父類方法時,參數類型是可以在父類參數的基礎上添加 nullable 屬性的:

interface Fooable{  public function foo(Fooable $f);}interface LooseFoo extends Fooable{  function foo(?Fooable $f);}

反過來不行。可能剛看到這點,大家都會有疑問為什么返回類型和參數類型會有這樣的設定。其實大家想想 Liskov 替換原則就明白了。
最后是關于參數默認值的問題,目前 PHP 是可以這樣做的:

function foo_default(Bar $bar = null) {}foo_default(new Bar); // validfoo_default(null); // validfoo_default(); // valid

但如果改成 nullable 的類型申明,即使傳入的參數是 null,也不能在調用的時候省略不寫:

function foo_nullable(?Bar $bar) {}foo_nullable(new Bar); // validfoo_nullable(null); // validfoo_nullable(); // INVALID!

由此可見 nullable 類型的目的是為了允許某個參數帶類型而且可以為 null,而默認值為 null 的參數就真的是想告訴大家某個參數的默認值是 null。以前我們如果允許某些 setter 可以置空,寫的代碼總是覺得怪怪的:

public function setIssueAt(/DateTime $issueAt = null)

覺得怪最大的原因我想是因為這樣的一個 setter 居然可以不傳參數!

這下好了,有了 nullable type,我們也就不會寫那么別扭的代碼了。

當然,nullable type 和 = null 是可以同時用的。這里就不寫例子了,效果跟只用 = null 沒有區別。

最后,還是繼承:如果父類方法參數是 nullable 的,那么子類可以使用 = null

interface Contract{  public function method(?Foo $foo): bool;}class Implementation implements Contract{  public function method(?Foo $foo = null): bool  {    return is_null($foo);  }}

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 唐海县| 遵义市| 彰化市| 湟源县| 三河市| 卓资县| 开原市| 靖安县| 北流市| 阿坝县| 弋阳县| 黄冈市| 沙雅县| 常熟市| 罗山县| 松滋市| 广丰县| 安平县| 贵德县| 马尔康县| 竹北市| 东方市| 蒲江县| 西平县| 沙湾县| 明光市| 淄博市| 敖汉旗| 纳雍县| 宝坻区| 彭泽县| 隆子县| 时尚| 乐东| 大同县| 噶尔县| 天祝| 依安县| 河北区| 梨树县| 肥乡县|