- 公開日
PHPのプロパティをStrictに定義する
本記事はPHP Advent Calendar 2013一日目の記事として書きます。 現在僕しかカレンダーに参加していないようなのでお暇な方は是非参加してみてくださいね!
PHPといえばそのユルさ・ルーズさが嫌われる1つの原因ですよね(と同時に好かれる理由でもある)。例えばプロパティに関してこんなユルさがあります。
まずは1を見てください。public
なプロパティには普通にアクセスできて、private
なプロパティにはアクセスできない。普通ですね。
次に2です。未定義のhoge
プロパティにアクセスしてみます。Undefined property
で怒られます。ここもOK.
次に3。未定義のhoge
プロパティを外部からセットしてみます。エラーは起こりません。この辺から少しおかしい。その後、もう一度2でやったことをやってみます。今度はうまくいきます(なんと!)。
「え、じゃあプロパティ外部から自由に定義し放題じゃないですか」と思ったあなた、その通り、PHPでは自由にプロパティを外部から弄くり回せちゃうわけです。4でやっているように。
解決策 (Strictなプロパティ)
実際のところもうちょっと厳密にプロパティを制御したいですよね。外部からプロパティを自由に操作してほしくはない。プロパティを強制することはできないだろうか、ということで出来上がったのがこちら。
まず注目してもらいたいのは、val
という変数をprivate
として宣言しているところです。これによりval
変数はクラスに隠蔽されています。
ではどうval
変数にアクセスするのか? 通常であればgetVal()
,setVal()
なんていうアクセッサーを用意しちゃうところですが、ここでは__get
, __set
のマジックメソッドを利用することで普遍的に実装しています。
これにより最初に紹介した例の3,4のような自由にプロパティを外部から定義できちゃうようなことは防げます。小さい実装のわりにはこれで得られるメリットが大きく、我ながら素敵な実装と思うんですが、どうでしょう?
次回のPHP Advent CalendarはPHP5.4について書きたいと思います。