B-Teck!

お仕事からゲームまで幅広く

phpの継承についてのメモ

こまごましたロジックとかはちょいちょい書いてたけど、
いまいち継承とかみたいなオブジェクト指向!って感じの考え方がうまく身についてなくて。

せっかくだしまとめてメモ書きみたいにしとこうかなと。

<?php
class Test1 {
    // メソッド名がクラス名と同じでもコンストラクタになる
    // ex) public function Test1(){}
    public function __construct(){
        //self::test22()だとメンバ関数を呼んでしまう
        //インスタンス内で自身のメソッドを呼ぶのは$this
        $this->test22();
    }

    public function test22(){
        // Test1をインスタンス化した時にはこっちが実行される
        echo "this is test1<BR>";
    }
}

class Test2 extends Test1{
    // Test1を継承してるので、コンストラクタはTest1のものを使う
    // もしTest1でself::test22()と書いてあると、Test1::test22()
    // が実行される。
    public function test22(){
  // Test2をインスタンス化した時にはこっちが実行される
        echo "this is test2<BR>";
    }
}

// インスタンス化
$a = new Test1;
$b = new Test2;
//結果
// this is test1
// this is test2

コメントにも書いてるけど、selfはメンバ関数を呼んでしまうので、
インスタンス関数を呼び出したい場合は$thisを使う。

なんでこんなことしたかって言うと、
ZendFrameworkのinitとは別に個別のコントローラーで実行するinitを作りたくて。
現場のやつはフレームワークに手を入れてたんだけど、
こういうやり方もあるよなぁっと考えてみた。

<?php
// 元となるコントローラー
// 各コントローラーで共通の処理とか書く?
class rootController extends Zend_Controller_Action
{
    public function init()
    {
        // !コントローラー個別処理前の処理!
        // 継承先のpartInit();を読み込ませる
        // !コントローラー個別処理後の処理!
        $this->partInit();
    }
}

// 個別機能のコントローラー
class indexController extends rootController
{
    // 個別のコントローラー内ではこのメソッドがinit替りになる
    public function partInit(){
    }

    public function indexAction() {
    }
}

こんな感じで?
2つ目のソースは動かしてないからなんかあってもしーらない