十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
小編給大家分享一下PHP7.1新功能之Nullable Type怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
具體如下:
在 PHP5 時(shí)代,PHP 的參數(shù)已經(jīng)支持 type hint(除了基本類(lèi)型),想必大家應(yīng)該很熟悉;后來(lái) PHP7 時(shí)代來(lái)臨,PHP 也可以指定返回值的類(lèi)型(以及基本類(lèi)型的 type hint)。但我們可能還有一種需求:除了指定的 type hint,參數(shù)或者返回值也能定義可以為 null,舉個(gè)例子,假如我們有一個(gè) UserRepository 類(lèi),有一個(gè)方法叫 find($id),此方法可返回一個(gè) User 對(duì)象,也可返回 null,在 PHP7.1 里就可以這么定義了:
...
class UserRepository { ... public function find($id): ?User { ... return $user; // or // return null; } }
但這么申明以后,如果返回 null,是否必須顯式調(diào)用 return null,這就得等 7.1 正式出來(lái)之后再驗(yàn)證了。
當(dāng)然還有參數(shù)設(shè)定是否 nullable 的例子,直接復(fù)制官網(wǎng)里的例子:
function say(?string $msg) { if ($msg) { echo $msg; } } say('hello'); // ok -- prints hello say(null); // ok -- does not print say(); // error -- 丟失屬性 say(new stdclass); //error -- 類(lèi)型錯(cuò)誤
以上便是 nullable type 的大致用法,但其實(shí)引入了此種機(jī)制以后,有很多細(xì)節(jié)都是需要注意的,比如在繼承的時(shí)候,子類(lèi)允許去掉父類(lèi)同名方法的返回類(lèi)型為 nullable 的設(shè)置:
interface Fooable { public function foo(): ?Fooable; } interface StrictFooable extends Fooable { public function foo(): Fooable; // valid }
但反過(guò)來(lái),子類(lèi)是不允許添加返回類(lèi)型可以為 nullable 的。
然后我們?cè)賮?lái)看看參數(shù)類(lèi)型的情況。跟返回類(lèi)型相反,子類(lèi)在復(fù)寫(xiě)父類(lèi)方法時(shí),參數(shù)類(lèi)型是可以在父類(lèi)參數(shù)的基礎(chǔ)上添加 nullable 屬性的:
interface Fooable { public function foo(Fooable $f); } interface LooseFoo extends Fooable { function foo(?Fooable $f); }
反過(guò)來(lái)不行??赡軇偪吹竭@點(diǎn),大家都會(huì)有疑問(wèn)為什么返回類(lèi)型和參數(shù)類(lèi)型會(huì)有這樣的設(shè)定。其實(shí)大家想想 Liskov 替換原則就明白了。
最后是關(guān)于參數(shù)默認(rèn)值的問(wèn)題,目前 PHP 是可以這樣做的:
function foo_default(Bar $bar = null) {} foo_default(new Bar); // valid foo_default(null); // valid foo_default(); // valid
但如果改成 nullable 的類(lèi)型申明,即使傳入的參數(shù)是 null,也不能在調(diào)用的時(shí)候省略不寫(xiě):
function foo_nullable(?Bar $bar) {} foo_nullable(new Bar); // valid foo_nullable(null); // valid foo_nullable(); // INVALID!
由此可見(jiàn) nullable 類(lèi)型的目的是為了允許某個(gè)參數(shù)帶類(lèi)型而且可以為 null,而默認(rèn)值為 null 的參數(shù)就真的是想告訴大家某個(gè)參數(shù)的默認(rèn)值是 null。以前我們?nèi)绻试S某些 setter 可以置空,寫(xiě)的代碼總是覺(jué)得怪怪的:
public function setIssueAt(\DateTime $issueAt = null)
覺(jué)得怪較大的原因我想是因?yàn)檫@樣的一個(gè) setter 居然可以不傳參數(shù)!
這下好了,有了 nullable type,我們也就不會(huì)寫(xiě)那么別扭的代碼了。
當(dāng)然,nullable type 和 = null 是可以同時(shí)用的。這里就不寫(xiě)例子了,效果跟只用 = null 沒(méi)有區(qū)別。
最后,還是繼承:如果父類(lèi)方法參數(shù)是 nullable 的,那么子類(lèi)可以使用 = null
interface Contract { public function method(?Foo $foo): bool; } class Implementation implements Contract { public function method(?Foo $foo = null): bool { return is_null($foo); } }
以上是“PHP7.1新功能之Nullable Type怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!