Laravel のソースで見るようになった #[ReturnTypeWillChange] とは何なのか
まえがき
Laravel のソースで #[ReturnTypeWillChange] というのを多々見るようになりました。これは、Ver 8.53.0 (2021-08-03) 辺りでほぼ実装を終えたようですが、一体何なのでしょうか?
参考:
scrapbox(日本語)
PHP RFC: Add return type declarations for internal methods
GitHub #38221 #38212 #38226 #37838
本題
記事にしておいて何ですが、参考リンクの1番目に書いた記事に ReturnTypeWillChange についてまとまっているので参考にして下さい。
要は、PHP8.1で追加された機能のアトリビュートの1つで、これを付けるとPHPの内部メソッドに追加された return type により引き起こされる Deprecated エラーを抑制する事ができるという話になりますね。つまりは、PHP8.1対策の1つです。
一般の我々としては、今後は、例えば、 Countable を実装して count() メソッドを定義する際は、
class FooCountable implements Countable
{
public function count(): int // ← ここ : int
{
return 1;
}
}
としておけばOKとなりますね。(PHP5とかでない限りは)
ただ、フレームワーク側としては、そうも行かない事情もあるのかと思います。
上記の FooCountable がフレームワーク側だとして、このクラスを継承して count() メソッドを override したユーザー側のプログラムが、同様に : int を付けてないと、
Fatal error: Declaration of XXX::count() must be compatible with MyCountable::count():
のようなエラーになってしまうでしょうし、他にもPHP8.0でないと DateTime|false のような union return types がサポートされてないという事情などもありそうです。(2番目の参考リンクに書いてありますが)
という事で、フレームワーク的には、 #[ReturnTypeWillChange] で対策するのが現実的な解決策という事なのかと思います。
雑感
そう言えば、deprecated のエラー自体は、前回記事にしましたが、今後の Laravel では抑制されるようになりましたね。
間違い等ありましたら、コメント下さい。
Discussion