PHP7のnull可能な戻り値の型


159

PHP 7では、戻り型宣言が導入されています。つまり、関数のパラメーターで可能なように、戻り値が特定のクラス、インターフェース、配列、呼び出し可能、または新しくヒント可能なスカラー型の1つであることを示すことができます。

function returnHello(): string {
    return 'hello';
}

多くの場合、値が常に存在するとは限らず、何らかのタイプの値またはnullのいずれかを返す可能性があります。デフォルトをnull(DateTime $time = null)に設定することでパラメーターをnull可能にすることができますが、戻り値の型に対してこれを行う方法はないようです。それは確かにそうなのですか、それともどうにかしてそれを行う方法を見つけていませんか?これらは機能しません:

function returnHello(): string? {
    return 'hello';
}

function returnHello(): string|null {
    return 'hello';
}

8
PHP7はまだnull許容の戻り値型を許可しませんが、PHP 7.1 これに対処することを目的としたRFCがあります。その場合、表示される表記は次のようになりますfunction returnString(?string $stringNull) : ?string { return $stringNull;}
エリアスヴァンウーテゲム

1
今のところ、アプリケーションの例外を悪用することでnullの可能性をエミュレートすることになりました。同様に愚かなことで、あなたしている罰金場合、これは有用であることがありますgithub.com/JeroenDeDauw/OhMyPhp/blob/master/src/...
イェルーン・デ・Dauw

おそらく、PHP7 Trowableインターフェース(具体的にはの拡張TypeError)を使用する方が理にかなっているかもしれません
Elias Van Ootegem

回答:


258

PHP 7.1では、null許容の戻り値型がサポートされるようになりました。私がリンクした最初のRFCは、彼らが目指したものです:

function nullOrString(int $foo) : ?string
{
    return $foo%2 ? "odd" : null;
}

古い答え:

私のコメントは実際には質問への答えだったので:

PHP 7はまだnull許容の戻り値の型をサポートしていませんが、これに対処するためのRFCがあり、PHP 7.1でのリリースを目指しています。合格した場合、構文はすべての型ヒント(戻り型と型ヒントの両方)に影響します。

public function returnStringOrNull(?array $optionalArray) : ?string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

ユニオンタイプを追加するための競合するRFCもあります。これは同じことを実行できますが、見た目が異なります。

public function returnStringOrNull(array|null $optionalArray) : string|null
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

ただし、現時点では、次のように記述する必要があります。

public function returnStringOrNull( array $optionalArray = null)
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
}

または、戻り値の型と一致する空の文字列を返し、偽の値を確認します。

public function returnStringOrNull( array $optionalArray = null) : string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
    return '';
}
//call
$string = $x->returnStringOrNull();
if (!$string) {
    $string = $x->returnStringOrNull(range(1, 10));
}

5
PHP 7 won't support nullable return-types just yet, but there's an RFC out to address just that-そう、RFC、「まだ」。私を誤解しないでください-私は今までPHP3の時間を本当にぶら下がっていたのでギャップがないので、本当にヘビーなPHPユーザーです。ユーザーは混乱を見て、下位互換性のある方法でそれをクリーンアップすることをいとわないので、「ノー」になります。混乱するメソッドのクリーンな方法?null特別な市民ではないのを修正しましたか?いいえ、必要ありません。すべてのものを大文字と小文字を区別するオプションを追加しますか?いや、それから、人々が変わることに驚かされる。
Marcin Orlowski

1
@MarcinOrlowski:null可能な戻りの型ヒントは意味があります。私は7つのRFCをいくつかフォローしてきましたが、それらの多くを拒否することに大部分は同意しました。彼らが重点を置いた変更は、ランタイムやコンパイラにあったほど言語に影響するものではありませんでした。拒否された一部のRFCについては、ディスカッションスレッドを読んで、なぜそれらの変更を実装しないことを選択したのか(たとえば、非推奨var)を理解する価値があります。欠点は、代わりに、あまりにも多くの便利なもの(たとえば、宇宙船のオペレーター)を受け入れたということです
エリアスヴァンオーテゲム

@EliasVanOotegem 7.1が12月1日にリリースされたため、null許容型が適切にサポートされるようになりました。
孤独な日

@lonesomeday:確かに、リンクと基本的な例を私の回答の下部に追加しました
エリアスヴァンウーテゲム

mmm ishこの回答を更新するには良いタイプです!つまり、ユニオンタイプはPHP 7.1でサポートされていないようです
Dennis

67

null可能型はPHP 7.1で使用できます。

これは構文例です:

public function getName(): ?string
{
    return $this->name; // name can be null
}

PHP 7.1が一般提供され、PHP 7.0からアップグレードできます(確認が必要な後方互換性のない変更はほとんどありません)。


22
IMO "nullable"を実装せずに戻り型宣言を提供するのは冗談です。「null許容」機能が実装されるまで、戻り値の型は使用できません。
joonas.fi 2016

2
@ joonas.fi IMO厳密に型指定された戻り値は常にその型である必要があります。nullの戻り値はそのコントラクトには適用されず、null値の理由に意味を与える例外をスローする必要があります。
Steve Buzonas

8
@SteveBuzonas Personを表すオブジェクトでgetAgeInYears()メソッドを検討する場合、年齢を知らせていない人物をどのようにモデル化しますか?nullを返しますか?0を返しますか?nullを返すことは意味的に「わからない」を意味し、0は意味的に「その人は0歳」を意味します。したがって、私はgetAgeInYears():?intが最良の設計であると主張します。例外のスローは、例外として予約する必要があります。ほとんどのシステムで人の年齢を知らないことは、例外的なケースと見なされるべきではありません。
joonas.fi 2016年

@ joonas.fiは非常に真実であり、それは一般的な慣行です。ただし、実装では、フィールドがnull可能であり、それに応じて明示的に処理することを認識する必要があります。これは、try / catchと同じくらい簡単に実装できるnullの場合を除いて、 xで十分です。さらに、実行を継続するためにそのnull可能フィールドの値を実際に必要とする場合は、例外の方が適切なオプションである可能性があります。
Steve Buzonas

この構文によりPHPMDが多くのエラーをスローすることに気づきました。うまくいけば、彼らはすぐにそれを修正します。
トムジョウィット2017

0

どのタイプでも機能します。
例:

public function getOpportunity(): ?Opportunity
{
    return $this->opportunity;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.