「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。今回は、アクセス修飾子、カプセル化と隠蔽(いんぺい)、アクセサー、コンストラクター/デストラクターについて解説し、最後に「再代入の是非」について触れます。
「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する本連載。初回となる前回の「PHPにおけるクラスの書き方と呼び出し方――インスタンス、メソッド、プロパティ」では、「クラス」の書き方と簡単な使い方、メソッド/クラス定義内関数、プロパティ/クラス定義内変数、マルチプルインスタンスを紹介しました。
今回は、アクセス修飾子、カプセル化と隠蔽(いんぺい)、アクセサー、コンストラクター/デストラクターについて解説し、最後に「再代入の是非」について触れます。
まずは、前回「関数(メソッド)はpublicで、変数(プロパティ)はprivate」と固定で書いていた「アクセス修飾子(アクセス権)」について、もう少し詳しく解説していきます。
アクセス修飾子はメソッドやプロパティを「どれくらい外側から触ってもよいか」を指定するためのキーワードで、public(外からOK)、protected(クラス内、あるいは継承先のクラス内ならOK)、private(クラス内のみ)の3種類です。
実際にコードを書いて、「できること」と「できないこと」をコードで確認していきましょう。
- <?php
- class hoge {
- public function pub_func() {
- echo "call pub_func\n";
- }
- protected function pro_func() {
- echo "call p_func\n";
- }
- private function pri_func() {
- echo "call pri_func\n";
- }
- }
- //
- $obj = new hoge();
- $obj->pub_func();
- //$obj->pro_func(); // コメントを外すとエラーになる
- //$obj->pri_func(); // コメントを外すとエラーになる
public以外のアクセス修飾子(protectedやprivate)を指定すると、クラスの外からはそのメソッドが呼び出せなくなります。
「そのメソッドを定義しているクラスの中からの呼び出しならprotectedやprivateなメソッドが呼び出せる」ことは、以下のコードから確認できます。
- <?php
- class hoge {
- public function pub_func() {
- echo "call pub_func\n";
- $this->pro_func();
- $this->pri_func();
- }
- protected function pro_func() {
- echo "call p_func\n";
- }
- private function pri_func() {
- echo "call pri_func\n";
- }
- }
- //
- $obj = new hoge();
- $obj->pub_func();
privateとprotectedの違いは「継承」と深い関係があるので、次回、継承を解説するタイミングで合わせて説明します。今はいったん「同じようなものである」と考えておいてよいでしょう。
上述はメソッド(関数)ですが、プロパティ(変数)も同じアクセス修飾子を持ち、同じ状況になります。
- <?php
- class hoge {
- public $_pub_val;
- protected $_pro_val;
- private $_pri_val;
- }
- //
- $obj = new hoge();
- $obj->_pub_val = 10;
- //$obj->_pro_val = 20; // コメントを外すとエラーになる
- //$obj->_pri_val = 30; // コメントを外すとエラーになる
- var_dump($obj);
protectedやprivateなプロパティ(変数)は、メソッド(関数)の中からであれば、触ることができます。
- <?php
- class hoge {
- //
- public function f() {
- $this->_pro_val = 20;
- $this->_pri_val = 30;
- }
- //
- public $_pub_val;
- protected $_pro_val;
- private $_pri_val;
- }
- //
- $obj = new hoge();
- $obj->_pub_val = 10;
- $obj->f();
- var_dump($obj);
ここでは「アクセス修飾子によって、こんなことができる、またはできない」という実際の動きを理解してください。
Copyright © ITmedia, Inc. All Rights Reserved.
Coding Edge 鬯ッ�ッ�ス�ョ�ス�ス�ス�ォ�ス�ス�ス�ス�ス�ス�ス�ェ鬯ョ�ッ陋ケ�コ�ス�サ郢ァ謇假スス�ス�ス�ソ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�コ鬯ョ�」陋ケ�ス�ス�ス�ス�オ鬮ォ�エ遶擾スオ�ス�コ�ス�キ�ス�ス�ス�ク�ス�ス�ス�キ�ス�ス�ス�ス�ス�ス�ス�ケ鬮ォ�エ髮懶ス」�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ウ鬯ッ�ゥ陝キ�「�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ュ鬯ッ�ゥ陝キ�「�ス�ス�ス�「鬮ォ�エ髮懶ス」�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ウ鬯ッ�ゥ陝キ�「�ス�ス�ス�「�ス�ス�ス�ス�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ー