PHP 8.1 ではnever
戻り値の型が導入されましたが、それは何ですか? never
ととはどう違いvoid
ますか?
2 に答える
8
never
return
暗黙的または明示的なステートメントを持たない関数の戻り値の型のヒントとして使用される型宣言が導入されました。また、例外をスローするか、関数を使用して終了することによって終了する必要があります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
ません。never
void を含む、PHP の型システムの他のすべての型のサブタイプです (これにより、戻り型の共分散が可能になります)。- どちらも値を返すことはできません。
- どちらもパラメーターまたはプロパティ タイプとして使用できません。
- どちらもアロー関数の戻り値の型として使用できません。
- 両方とも、スタンドアロン タイプとしてのみ使用できます (ユニオンまたは交差は許可されません)。
いつ選択するかvoid
、never
またはその逆か?
void
関数呼び出しの後に PHP が次のステートメントを実行すると予想される場合は、関数の戻り値の型を宣言する必要があります。never
また、その関数呼び出しの後に PHP が次のステートメントを実行することが予想されない場合は、それを宣言する必要があります。
于 2021-07-26T12:13:16.723 に答える