「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.