PHP を習い始めてみると、Web アプリケーションを作る事に主題があるため、データベースの使い方、セッションやクッキーなどを利用した認証管理、メールの扱い方、開発に必要なフレームワーク、何よりも Web を取り巻く環境についての学習で手一杯だ。そのため、言語それ自体が持つオブジェクト指向プログラミングの機能について、かなり疎かにしていた事に気が付いた。
今後はもう少し突っ込んで勉強しようかと反省をしている。
さて今回、クラス継承した子クラスでメソッドをオーバーライドしたとき、親クラスでそのメソッドを呼び出していた場合、親クラスのメソッドが有効なのか、子クラスのメソッドが有効なのか悩んだのでテストして見ることにした。プログラムは以下の通り。
<php class papa { public function __construct() { $this->hello(); } protected function hello() { echo 'フムフム'; } } class son extends papa { protected function hello() { echo 'キタ━━━━(゚∀゚)━━━━ !!!!!'; } } $ore = new son();
さて、結果はいかに?何と、
キタ━━━━(゚∀゚)━━━━ !!!!!
でした。それでは、「protected」を「private」にするとどうなるか?
フムフム
でした。「public、protected、private」は、スコープに影響するので正しく使わないといけないですね。
次に、子クラスにもコンストラクタを用意するとどうなるでしょうか?子クラスを次のように書き換える。
class son extends papa { public function __construct() { $this->thanks(); } protected function hello() { echo 'キタ━━━━(゚∀゚)━━━━ !!!!!'; } protected function thanks() { echo 'ドモドモ'; } }
結果は、
ドモドモ
でした。親クラスのコンストラクタは呼び出されないので、初期化で必要なら必ず呼び出すように。
class son extends papa { public function __construct() { parent::__construct(); $this->thanks(); }
以上、オレ備忘録でした。
PHP Ver.5.2.14