web-dev-qa-db-ja.com

PHP戻り値の型のヒント、オブジェクトORブール値?

したがって、php7で戻り値の型のヒントを実行できることを知っています。次の方法でオブジェクトの戻りヒントを実行できます。

function getUser($pdo, $username) : User
{

}

ここで、Userは返されるオブジェクトです。

ただし、SQLでユーザーが見つからない場合は、Userオブジェクトの代わりに'false'を返すと次のようになります。

Uncaught TypeError:UserFind :: findUser()の戻り値はUserのインスタンスである必要があり、ブール値が返されます

しかし、SQLがユーザーを見つけられない場合はどうなるでしょうか。ユーザーが存在しない場合、どうすればブール値のfalseを返すことができますか?このシナリオでは、戻り値の型のヒントを無視する必要がありますか?

編集:私は他の質問「php7のNullable戻り値の型」を見ました。私の質問はほとんど同じですが、2つの型のいずれかを返す方法があるかどうかを尋ねて質問を拡張したいと思います。たとえば、オブジェクトが存在しない場合は、オブジェクトまたは文字列を返しますか?

18
life

あなたが話しているのは、ユニオンタイプと呼ばれています。あります 内部でそれについてのかなりの議論

このRFCは、パラメータまたは戻り値の型に対して複数の可能な型を定義する機能を提案し、それらを「共用体型」と呼びます。値が共用体のメンバーのいずれかを渡す場合、値は共用体型の型チェックに合格します。 2つ以上のタイプのそれぞれの間に垂直バー(OR)が配置されます。

配列またはTraversableのいずれかを受け入れ、他のタイプを受け入れないパラメーターの例を次に示します。

function (Array | Traversable $in) {
    foreach ($in as $value) {
        echo $value, PHP_EOL;
    }
}

ユニオンには3つ以上のタイプがあります。例として、データベースと対話するルーチンが次の3つの結果のいずれかを持つことはやや一般的です。

  1. 正常に結果が見つかりました
  2. 結果が見つかりませんでした
  3. エラーが発生しました

これはすべてPHP 7.1を対象としていますが、まだ投票には至っていません(ましてや合格するように見えます)。

では、あなたの問題はどうですか?私は、少なくとも今のところ、あなたのリターンのヒントをタイプしないでください。 Userまたはfalseを返すことができることを示すドキュメントブロックを発行するだけです

/**
 * @param \PDO $pdo
 * @param string $username
 * @return User|false
 */
19
Machavity