めのん@ひとりプログラミング同好会

このブログはすべてフィクションであり、実在の人物、団体とは一切関係ありません

マジックメソッド__setで型付きプロパティ

こんばんは、めのんです!

今日のお昼はPHP 8.0のunion typesの話題に触れました。 その記事を書きながら思ったのは、PHPは最初は静的な型がなかったけれども、やがて消極的に静的な型を指定する方向に舵を切り始め、徐々にその範囲を拡大していったんだろうなあということです。

PHP 7.4からは、クラスのプロパティにも静的な型を付けられるようになっています。 一方で、マジックメソッドgetやsetで定義されていないプロパティを扱おうとすると、普通にやったのでは伝統的な形無しプロパティしか扱えなくなります。

そこで、今回はマジックメソッドgetやsetを使う場合でも、型付きプロパティにできないか考えてみました。

今回は実験的な試みですので、あまり凝ったことはせずにシンプルに考えようと思います。 最初に__setが呼び出されたときに渡された値の型を真として、以後、その型のみを受け付けることにします。 異なる型の値を代入しようとすると、例外を投げることにしましょう!

ざっとコーディングしてみましたが、こんな感じでどうでしょうか?

f:id:elddiry:20200626231544p:plain
型付きの__set

本来なら、元の型がfloatだったとしても、int型の値は暗黙的に型変換してもいいんじゃないかと思います。 そういう細かいことまでは、今回は考慮していません。

こういうのをドンドン発展させていけば、いろいろ面白いことができそうですね!

それでは!!