欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年09月26日 12:05:47   作者:kp12345  
這篇文章主要介紹了PHP7.1新功能之Nullable Type用法,結(jié)合實(shí)例形式較為詳細(xì)的對(duì)比分析了Nullable Type類(lèi)型操作的使用技巧,需要的朋友可以參考下

本文實(shí)例分析了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);
  }
}

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • php實(shí)現(xiàn)的rc4加密解密類(lèi)定義與用法示例

    php實(shí)現(xiàn)的rc4加密解密類(lèi)定義與用法示例

    這篇文章主要介紹了php實(shí)現(xiàn)的rc4加密解密類(lèi)定義與用法,結(jié)合完整實(shí)例形式給出了php rc4加密解密類(lèi)文件class.rc4crypt.php的定義及相關(guān)使用技巧,需要的朋友可以參考下
    2018-08-08
  • php編寫(xiě)的mysqli增刪改查數(shù)據(jù)庫(kù)操作類(lèi)示例

    php編寫(xiě)的mysqli增刪改查數(shù)據(jù)庫(kù)操作類(lèi)示例

    這篇文章主要為大家介紹了php編寫(xiě)的mysqli增刪改查數(shù)據(jù)庫(kù)操作類(lèi)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • php寫(xiě)入文件不覆蓋的實(shí)例講解

    php寫(xiě)入文件不覆蓋的實(shí)例講解

    在本篇文章里小編給大家分享關(guān)于php寫(xiě)入文件不覆蓋的實(shí)例講解以及知識(shí)點(diǎn)總結(jié),需要的可以參考下。
    2019-09-09
  • php對(duì)稱(chēng)加密和解密的實(shí)現(xiàn)詳解

    php對(duì)稱(chēng)加密和解密的實(shí)現(xiàn)詳解

    加密是為了信息傳遞更加安全,這樣才能更好的讓信息傳遞更具有保密性,不會(huì)被他人隨意篡改,本文為大家介紹了php實(shí)現(xiàn)簡(jiǎn)單的對(duì)稱(chēng)加密和解密過(guò)程,希望對(duì)大家有所幫助
    2023-11-11
  • PHP6 中可能會(huì)出現(xiàn)的新特性預(yù)覽

    PHP6 中可能會(huì)出現(xiàn)的新特性預(yù)覽

    PHP核心團(tuán)隊(duì)開(kāi)發(fā)者Pierre Joye近日在官網(wǎng)上貼出了PHP6中可能會(huì)出現(xiàn)的新特性。之所以說(shuō)是“可能會(huì)出現(xiàn)”,是因?yàn)槟壳癙HP6項(xiàng)目還處于草案階段,這些特性還只是一個(gè)想法,還需要討論,隨時(shí)都有可能變更
    2014-04-04
  • PHP實(shí)現(xiàn)從PostgreSQL數(shù)據(jù)庫(kù)檢索數(shù)據(jù)分頁(yè)顯示及根據(jù)條件查找數(shù)據(jù)示例

    PHP實(shí)現(xiàn)從PostgreSQL數(shù)據(jù)庫(kù)檢索數(shù)據(jù)分頁(yè)顯示及根據(jù)條件查找數(shù)據(jù)示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)從PostgreSQL數(shù)據(jù)庫(kù)檢索數(shù)據(jù)分頁(yè)顯示及根據(jù)條件查找數(shù)據(jù)操作,涉及PHP操作PostgreSQL數(shù)據(jù)庫(kù)的SQL條件查詢(xún)、分頁(yè)、顯示等相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • PHP使用Reli分析性能,生成PHP性能火焰圖

    PHP使用Reli分析性能,生成PHP性能火焰圖

    Reli 是一個(gè)用PHP編寫(xiě)的采樣分析器(或VM狀態(tài)檢查器),它可以從進(jìn)程外部讀取有關(guān)運(yùn)行PHP腳本的信息,它是一個(gè)獨(dú)立的CLI工具,因此目標(biāo)程序不需要任何修改,檢測(cè)和可視化PHP腳本中的瓶頸,它不僅提供函數(shù)級(jí)的分析,而且還提供行級(jí)或操作碼級(jí)的解析
    2024-01-01
  • PHP連接SQLServer2005的方法

    PHP連接SQLServer2005的方法

    本文主要向大家介紹了如何使用php連接sqlserver2005數(shù)據(jù)庫(kù)的方法,并附上連接必需的DLL文件,及簡(jiǎn)單示例,這里推薦給小伙伴
    2015-01-01
  • PHP中Echo結(jié)構(gòu)的用法

    PHP中Echo結(jié)構(gòu)的用法

    PHP echo嚴(yán)格來(lái)說(shuō)是一個(gè)語(yǔ)言結(jié)構(gòu)(language construct)而不是一個(gè)函數(shù),echo的功用是用來(lái)輸出字串,是使用率非常高的一個(gè)語(yǔ)言結(jié)構(gòu),特別是未使用樣版模式的系統(tǒng),與echo類(lèi)似的還有print,兩者差別并不大,普通的時(shí)候,其實(shí)使用echo就可以了
    2022-06-06
  • php中preg_replace_callback函數(shù)簡(jiǎn)單用法示例

    php中preg_replace_callback函數(shù)簡(jiǎn)單用法示例

    這篇文章主要介紹了php中preg_replace_callback函數(shù)簡(jiǎn)單用法,分析了preg_replace_callback函數(shù)的功能及簡(jiǎn)單使用方法,需要的朋友可以參考下
    2016-07-07

最新評(píng)論