6

PHP 8.1 ではnever戻り値の型が導入されましたが、それは何ですか? neverととはどう違いvoidますか?

4

2 に答える 2

8

neverreturn暗黙的または明示的なステートメントを持たない関数の戻り値の型のヒントとして使用される型宣言が導入されました。また、例外をスローするか、関数を使用して終了することによって終了する必要がありますexit/die

function redirect(string $uri): never 
{
    header('Location: ' . $uri);
    exit();
}

これは、次redirectの理由から、決して返さない関数と呼ばれます。

1)return明示的に定義されたステートメントがありません。

function redirect(string $uri): never 
{
    exit();
    return 'something';
}

プロデュースします:

PHP 致命的なエラー: 決して返さない関数は返してはなりません

2)return暗黙的に定義されたステートメントはありません。

function redirect(string $uri): never
{
    if (false) {
        header('Location: ' . $uri);
        exit();
    }
}

ここでの条件は決して満たされないため、実行は if ステートメントを飛び越えて暗黙NULLを返し、結果は次のようになります。

PHP 致命的なエラー: キャッチされていない TypeError: リダイレクト (): 決して返さない関数は暗黙的に返してはなりません

3)exit関数で実行を終了します

ボイド vs ネバー

  • void持つことができますreturn;が、neverできません。
  • never関数がスローされるか、exit/die で終了することを強制しますが、強制しvoidません。
  • nevervoid を含む、PHP の型システムの他のすべての型のサブタイプです (これにより、戻り型の共分散が可能になります)。
  • どちらも値を返すことはできません。
  • どちらもパラメーターまたはプロパティ タイプとして使用できません。
  • どちらもアロー関数の戻り値の型として使用できません。
  • 両方とも、スタンドアロン タイプとしてのみ使用できます (ユニオンまたは交差は許可されません)。

いつ選択するかvoidneverまたはその逆か?

void関数呼び出しの後に PHP が次のステートメントを実行すると予想される場合は、関数の戻り値の型を宣言する必要があります。neverまた、その関数呼び出しの後に PHP が次のステートメントを実行することが予想されない場合は、それを宣言する必要があります。

于 2021-07-26T12:13:16.723 に答える