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について書きたいと思います。