PHP8から複数の型をプロパティやメソッドの戻り値に設定できるようになりました。
|
(パイプ)を使うことで、複数の型に対応したプロパティやメソッドの戻り値が書けます。
公式の記事はこちらです。
コードはgithubに置いています。
GitHub - YasuakiHirano/poc-php8-docker
Contribute to YasuakiHirano/poc-php8-docker development by creating an account on GitHub.
複数の型を使用したサンプルコード
サンプルコード
GameScoreというクラスを用意して、ポイント(得点)のプロパティを持たせました。
このプロパティがint|float
と2つの型を指定しています。
getScoreメソッドを呼ぶと、設定したポイントを返してくれます。
メソッドの返り値としてもint|float
の2つの型を指定しました。
class GameScore {
public function __construct(
private int|float $point
) {}
public function getScore() : int|float {
return $this->point;
}
}
実行する(正常パターン)
このように実行してみました。
それぞれ整数と少数を渡したインスタンスを作成して、getScoreメソッドを呼んでいます。
$game1 = new GameScore(85);
echo $game1->getScore()."\n";
$game2 = new GameScore(85.24);
echo $game2->getScore()."\n";
受け付けれる引数(整数と少数)なので、エラーにならずに、整数と少数が返ってきました。
85
85.24
実行する(エラーパターン)
このように文字列を設定して実行すると。。
$game3 = new GameScore('abwaf');
受け付け不可能なデータ(文字列)なので、実行時にエラーになります。
内容を見ると、Uncaught TypeError
となっていて、対応していない型なのでエラーになりました。
Fatal error: Uncaught TypeError: GameScore::__construct(): Argument #1 ($point) must be of type int|float, string given, called in /var/www/html/union_type.php on line 22 and defined in /var/www/html/union_type.php:4
Stack trace:
#0 /var/www/html/union_type.php(22): GameScore->__construct('abwaf')
下記のように、メソッドで対応していない型のデータを返そうとした場合も同じエラーになります。
public function getScore() : int|float {
return `hogehoge`;
}
型が違う場合にTypeErrorの例外をスローするようになっています。
TypeErrorについては公式のこちらに書いています。
コメント