🍣

Laravel のソースで見るようになった #[ReturnTypeWillChange] とは何なのか

2021/11/06に公開

まえがき

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