簡體   English   中英

PHP 7:多種函數返回類型

[英]PHP 7: Multiple function return types

所以,現在我們有了新的 PHP7,我們可以檢查返回類型是否是我們想要的。

例如,

function foo(): bool
{
    $num = 8;
    if (10 === $num) {
        return true;
    } else {
        return false;
    }
}
foo();

輸出: false

好吧,這很容易嗎? 它像它應該的那樣工作,但是如果回報不是我們所期望的?

function bar(): bool
{
    $num = 10;
    if (10 === $num) {
        return array(['apple', 'banana', 'strawberry']);
    } else {
        return false;
    }
}
bar();

輸出: Uncaught TypeError: Return value of foo() must be of the type boolean, array returned

這是非常基本的,這些例子只是展示了它是如何工作的。

如果我們有代碼示例 2 中的函數,我們可以檢查多個返回類型嗎? 喜歡

function bar(): bool || array    <---
{
    $num = 10;
    if (10 === $num) {
        return array(['apple', 'banana', 'strawberry']);
    } else {
        return false;
    }
}
bar();

但是這會導致: FATAL ERROR syntax error, unexpected '||' (T_BOOLEAN_OR), expecting '{' on line number 2 FATAL ERROR syntax error, unexpected '||' (T_BOOLEAN_OR), expecting '{' on line number 2

那么是否可以定義多個返回類型?

@scott-c-wilson 很好地解釋了語言規則的機制。

從設計的角度來看,具有可能返回不同類型結果的函數表明存在潛在的設計缺陷:

  • 如果您要返回結果,或者如果某些事情沒有按計划進行,則返回false 您可能應該拋出異常。 如果功能處理沒有按計划進行; 這是一種特殊情況:利用事實。 我知道 PHP 本身有一個習慣,如果事情不起作用,就會返回 false,但這只是表明 PHP 中的設計很差——出於同樣的原因。

  • 如果您的函數返回可能不同的東西,那么很可能它正在不止一件事,這在您的函數中是糟糕的設計。 函數應該做一件事。 如果你的函數有一個 if/else 和 true/false 塊處理不同的處理塊(而不是僅僅處理退出情況),那么這可能表明你應該有兩個函數,而不是一個。 讓調用代碼來決定使用哪個。

  • 如果您的函數返回兩種不同的對象類型,然后可以在調用代碼中以類似的方式使用它們(即:沒有if this: do that; else do this other thing in the calling code),這可能表明您應該返回一個接口,而不是一個具體的實現。

  • 可能會有合法的情況,返回不同的類型實際上是最好的做法。 如果是這樣:一切都很好。 但這就是使用松散類型語言的好處所在:只是不指定函數的返回類型。 但是...就是說...情況可能合法,因此首先通過前面的設計考慮來確定您是否真的有這些真正的邊緣情況之一,需要返回不同的類型。

是否可以定義多種返回類型?

不,這就是重點! 多種返回類型令人困惑,這意味着您需要進行額外的非直觀檢查(我在看着您,“===”)。

來自手冊:“...返回類型聲明指定將從函數返回的值的類型。” (強調我的)

類型,而不是類型。

更新至 2020 年。

已經對 Union 類型進行了投票,並被PHP 8接受。 https://wiki.php.net/rfc/union_types_v2

要在 PHP 中擁有多個返回類型,您只需要擁有 PHP 8,否則根本不可能。 但是,您不應該愚蠢地將所有內容都設置為可能的返回值,因為這可能會使您的代碼變得一團糟。 @Adam Cameron 在他的回答中很好地解釋了這一點。

Union types應該存在,但它們不存在。

例如,您可以使用?int ,但它會期望NULLINT

答案:

這是不可能的。 通過 PHP 本身沒有任何方法。

但是,您可以省略僅用於嚴格輸入的“類型聲明”。 例如,只需使用 DocBlocks @return bool|string IDE 會識別它,但 PHP 不會在意。

http://docs.phpdoc.org/references/phpdoc/tags/return.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM