91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP7.1新功能之Nullable Type怎么用

發布時間:2021-08-27 11:33:03 來源:億速云 閱讀:129 作者:小新 欄目:開發技術

小編給大家分享一下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 hello
say(null); // ok -- does not print
say(); // 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); // valid
foo_default(null); // valid
foo_default(); // valid

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

function foo_nullable(?Bar $bar) {}
foo_nullable(new Bar); // valid
foo_nullable(null); // valid
foo_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);
  }
}

以上是“PHP7.1新功能之Nullable Type怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

登封市| 苍溪县| 湘潭县| 交城县| 清丰县| 工布江达县| 长治县| 亚东县| 镇坪县| 灵山县| 新野县| 沁源县| 固始县| 津南区| 高要市| 黑河市| 维西| 福安市| 和田市| 巫溪县| 刚察县| 天长市| 安仁县| 扶绥县| 广州市| 平果县| 惠来县| 荣成市| 邵武市| 洛阳市| 宁德市| 海盐县| 公主岭市| 安达市| 时尚| 临夏市| 资阳市| 怀宁县| 乌拉特中旗| 秦安县| 成武县|