《PHP編程:PHP7.1新功能之Nullable Type用法分析》要點:
本文介紹了PHP編程:PHP7.1新功能之Nullable Type用法分析,希望對您有用。如果有疑問,可以聯系我們。
PHP編程本文實例分析了PHP7.1新功能之Nullable Type用法.分享給大家供大家參考,具體如下:
PHP編程在 PHP5 時代,PHP 的參數已經支持 type hint(除了基本類型),想必大家應該很熟悉;后來 PHP7 時代來臨,PHP 也可以指定返回值的類型(以及基本類型的 type hint).但我們可能還有一種需求:除了指定的 type hint,參數或者返回值也能定義可以為 null,舉個例子,假如我們有一個 UserRepository 類,有一個方法叫 find($id),此方法可返回一個 User 對象,也可返回 null,在 PHP7.1 里就可以這么定義了:
...
PHP編程
class UserRepository
{
...
public function find($id): ?User
{
...
return $user;
// or
// return null;
}
}
PHP編程但這么申明以后,如果返回 null,是否必須顯式調用 return null,這就得等 7.1 正式出來之后再驗證了.
PHP編程當然還有參數設定是否 nullable 的例子,直接復制官網里的例子:
PHP編程
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 -- 類型錯誤
PHP編程以上便是 nullable type 的大致用法,但其實引入了此種機制以后,有很多細節都是需要注意的,比如在繼承的時候,子類允許去掉父類同名方法的返回類型為 nullable 的設置:
PHP編程
interface Fooable
{
public function foo(): ?Fooable;
}
interface StrictFooable extends Fooable
{
public function foo(): Fooable; // valid
}
PHP編程但反過來,子類是不允許添加返回類型可以為 nullable 的.
PHP編程然后我們再來看看參數類型的情況.跟返回類型相反,子類在復寫父類方法時,參數類型是可以在父類參數的基礎上添加 nullable 屬性的:
PHP編程
interface Fooable
{
public function foo(Fooable $f);
}
interface LooseFoo extends Fooable
{
function foo(?Fooable $f);
}
PHP編程反過來不行.可能剛看到這點,大家都會有疑問為什么返回類型和參數類型會有這樣的設定.其實大家想想 Liskov 替換原則就明白了.
最后是關于參數默認值的問題,目前 PHP 是可以這樣做的:
PHP編程
function foo_default(Bar $bar = null) {}
foo_default(new Bar); // valid
foo_default(null); // valid
foo_default(); // valid
PHP編程但如果改成 nullable 的類型申明,即使傳入的參數是 null,也不能在調用的時候省略不寫:
PHP編程
function foo_nullable(?Bar $bar) {}
foo_nullable(new Bar); // valid
foo_nullable(null); // valid
foo_nullable(); // INVALID!
PHP編程由此可見 nullable 類型的目的是為了允許某個參數帶類型而且可以為 null,而默認值為 null 的參數就真的是想告訴大家某個參數的默認值是 null.以前我們如果允許某些 setter 可以置空,寫的代碼總是覺得怪怪的:
PHP編程
public function setIssueAt(\DateTime $issueAt = null)
PHP編程覺得怪最大的原因我想是因為這樣的一個 setter 居然可以不傳參數!
PHP編程這下好了,有了 nullable type,我們也就不會寫那么別扭的代碼了.
PHP編程當然,nullable type 和 = null 是可以同時用的.這里就不寫例子了,效果跟只用 = null 沒有區別.
PHP編程最后,還是繼承:如果父類方法參數是 nullable 的,那么子類可以使用 = null
PHP編程
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相關內容感興趣的讀者可查看本站專題:《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php面向對象程序設計入門教程》、《PHP網絡編程技巧總結》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
PHP編程希望本文所述對大家PHP程序設計有所幫助.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/3205.html