PHP7.1新功能之Nullable Type用法分析
本文實例分析了PHP7.1新功能之Nullable Type用法。分享給大家供大家參考,具體如下:
在 PHP5 時代,PHP 的參數(shù)已經(jīng)支持 type hint(除了基本類型),想必大家應(yīng)該很熟悉;后來 PHP7 時代來臨,PHP 也可以指定返回值的類型(以及基本類型的 type hint)。但我們可能還有一種需求:除了指定的 type hint,參數(shù)或者返回值也能定義可以為 null,舉個例子,假如我們有一個 UserRepository 類,有一個方法叫 find($id),此方法可返回一個 User 對象,也可返回 null,在 PHP7.1 里就可以這么定義了:
...
class UserRepository { ... public function find($id): ?User { ... return $user; // or // return null; } }
但這么申明以后,如果返回 null,是否必須顯式調(diào)用 return null,這就得等 7.1 正式出來之后再驗證了。
當(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 -- 類型錯誤
以上便是 nullable type 的大致用法,但其實引入了此種機制以后,有很多細節(jié)都是需要注意的,比如在繼承的時候,子類允許去掉父類同名方法的返回類型為 nullable 的設(shè)置:
interface Fooable { public function foo(): ?Fooable; } interface StrictFooable extends Fooable { public function foo(): Fooable; // valid }
但反過來,子類是不允許添加返回類型可以為 nullable 的。
然后我們再來看看參數(shù)類型的情況。跟返回類型相反,子類在復(fù)寫父類方法時,參數(shù)類型是可以在父類參數(shù)的基礎(chǔ)上添加 nullable 屬性的:
interface Fooable { public function foo(Fooable $f); } interface LooseFoo extends Fooable { function foo(?Fooable $f); }
反過來不行??赡軇偪吹竭@點,大家都會有疑問為什么返回類型和參數(shù)類型會有這樣的設(shè)定。其實大家想想 Liskov 替換原則就明白了。
最后是關(guān)于參數(shù)默認值的問題,目前 PHP 是可以這樣做的:
function foo_default(Bar $bar = null) {} foo_default(new Bar); // valid foo_default(null); // valid foo_default(); // valid
但如果改成 nullable 的類型申明,即使傳入的參數(shù)是 null,也不能在調(diào)用的時候省略不寫:
function foo_nullable(?Bar $bar) {} foo_nullable(new Bar); // valid foo_nullable(null); // valid foo_nullable(); // INVALID!
由此可見 nullable 類型的目的是為了允許某個參數(shù)帶類型而且可以為 null,而默認值為 null 的參數(shù)就真的是想告訴大家某個參數(shù)的默認值是 null。以前我們?nèi)绻试S某些 setter 可以置空,寫的代碼總是覺得怪怪的:
public function setIssueAt(\DateTime $issueAt = null)
覺得怪最大的原因我想是因為這樣的一個 setter 居然可以不傳參數(shù)!
這下好了,有了 nullable type,我們也就不會寫那么別扭的代碼了。
當(dāng)然,nullable type 和 = null 是可以同時用的。這里就不寫例子了,效果跟只用 = null 沒有區(qū)別。
最后,還是繼承:如果父類方法參數(shù)是 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); } }
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
相關(guān)文章
php編寫的mysqli增刪改查數(shù)據(jù)庫操作類示例
這篇文章主要為大家介紹了php編寫的mysqli增刪改查數(shù)據(jù)庫操作類示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08PHP實現(xiàn)從PostgreSQL數(shù)據(jù)庫檢索數(shù)據(jù)分頁顯示及根據(jù)條件查找數(shù)據(jù)示例
這篇文章主要介紹了PHP實現(xiàn)從PostgreSQL數(shù)據(jù)庫檢索數(shù)據(jù)分頁顯示及根據(jù)條件查找數(shù)據(jù)操作,涉及PHP操作PostgreSQL數(shù)據(jù)庫的SQL條件查詢、分頁、顯示等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06php中preg_replace_callback函數(shù)簡單用法示例
這篇文章主要介紹了php中preg_replace_callback函數(shù)簡單用法,分析了preg_replace_callback函數(shù)的功能及簡單使用方法,需要的朋友可以參考下2016-07-07