質問: phpのクラスに存在するメンバは、接続修飾子を付ける必要があります。外部から接続してもよいときは、public、クラスと子クラスのみのときは、protected、クラスのみのときは、privateです。 何もつけないとpublicとなります。php5.4以下のときに必要だったというjavascriptでもお馴染みのvarもpublicと同じ意味を有しています。 publicを選択すると無制限、無条件に外部へメンバを晒すことになり、protectedは、継承した子クラスのみに晒すことになります。 ここまでは、分かったのですがいざメンバに接続修飾子をつけようとなると、**どれになにを付けるべきなのかが分かりません。** カプセル化のたとえ話にテレビを使うことがあります。テレビは、利用者が選んだ周波数を本体に送ってくれる遠隔操作機器を使うことで番組を視聴できます。 テレビ本体のなかの配線や回路を弄ることなく子供からお年寄りまで簡単に操作することが出来ます。つまり必要な部分だけを見せ、不必要な部分は隠すというのがカプセル化だそうです。 ここで見せる必要のないものは、protected或いは、private、子供からお年寄りまで利用させたいものは、publicを選択するべきということがわかりました。 **しかしながらこれだけだと、どうしても心許ないのです。**なにか接続修飾子を選ぶ際の基準や規則のようなものは、無いのでしょうか。また見せる必要のないものは、二種類ありますがこれらは、どのようにして区別するのでしょうか。
回答: カプセル化の目的は、機能は変えないけどその実装(コーディング内容)を変更するときに、影響範囲が外部に及ぶのを防ぐことです。 クラスを作るのは、そのクラスの役割が提供する機能を実現するためですよね。その機能を実現するためには、そのクラスの役割が提供する機能とは直接は関係のないメンバ変数やメンバメソッドを実装しなければならない場合もあるでしょう。 それらを外部に見せて、外部が勝手に参照したりすると、実装内容を変更したときに、外部にも影響が及びます。これを防ぐために「見せる必要のないもの」は「隠す」のです。 例えば、「複数のデータを記憶するクラス」を作った場合に、データを記憶する方法として配列を使って作っていたとします。外部にその配列を見せてしまうと、配列から連想配列に実装を変更したくなったとしてもできなくなってしまいます。 また、「見せる必要のない」と記載されていますが、「見せる」イコール、メンバ変数を勝手に「更新できる」、メンバメソッドを「勝手に呼び出せる」と言うことにもなります。そのようなことをされてしまうと、先ほど申し上げた通り、内部実装を変更する際に、影響が外部に及ぶだけでなく、クラスの実装者が予期しない動作を招くことになります。