[PHP-users 19566]インスタンスの生成無しで利用するクラスメソッド内から、同クラスの他メソッド・プロパティを利用する方法について

yuji koga koga-y @ mcp-net.com
2003年 12月 25日 (木) 13:51:01 JST


お世話になります。古賀と申します。
表題の件について質問させて頂きます。

現在、以前作ったプログラムを手直し中です。

その中で、似たような子クラスがそれぞれバラバラに定義されている部分を多数発見
した為、
そのような部分を親クラスでまとめて定義し、各子クラスではパラメータのみを定義
することで
今後、子クラスを追加するときの手間を省けるよう、改良しようとしています。

以下に、大幅に簡略化した例を示します。

例1:各子クラスでバラバラに定義(現状)

class A{
    function count(){}; // アブストラクトメソッド
}

class goods extends A{
    function count(){
        $DB = DB::connect(略);
        return $DB->getOne("SELECT count(*) FROM goods_tbl");
    }
}

class user extends A{
    function count(){
        $DB = DB::connect(略);
        return $DB->getOne("SELECT count(*) FROM user_tbl");
    }
}

上のような、ほとんど共通の作りを持つ子クラスを
次の例2もしくは例3のように書き直すことで、簡略化し、
子クラスの定義を容易にしようとしています。

例2:各パラメータをメソッドで定義

class A{
    function count(){
        $DB = DB::connect(略);
        $query = sprintf(
            "SELECT count(*) FROM %s",
            $this->getTableName()
        );
        return $DB->getOne($query);
    }
    
    function getTableName(){}
}

class goods extends A{
    function getTableName(){
        return 'goods_tbl';
    }
}

class user extends A{
    function getTableName(){
        return 'user_tbl';
    }
}

例3:各パラメータをプロパティで定義

class A{
    
    var $tableName;
    
    function count(){
        $DB = DB::connect(略);
        $query = sprintf(
            "SELECT count(*) FROM %s",
            $this->tableName
        );
        return $DB->getOne($query);
    }
}

class goods extends A{
    var $tableName = 'goods_tbl';
}

class user extends A{
    var $tableName = 'user_tbl';
}

ここで問題なのですが、上記例2及び例3におけるcount()メソッドは、
オブジェクトメソッドとして

$goods = new goods;
$cnt = $goods->count();

として用いれば問題なく動作しますが、
インスタンスを生成しないクラスメソッドとして

$cnt = goods::count();

と用いると、$thisが定義されていない為、当然ですが正常に動作しません。

過去ログ[PHP-users 9142] クラス関数とオブジェクト関数で同一名を使うには?

等を参考に、クラス関数として呼び出された場合は、
メソッド内でインスタンスを生成することでこの問題を回避しようと考えましたが、
親クラスA側では、子クラスがどのようなクラス名で定義されるかわかりませんので、
生成しようがありません。

クラス関数 get_class() 等も、引数にインスタンスを渡さなければ
クラス名を返しませんので、望み薄です。

以上の質問を整理します。

1 インスタンスを生成しないでクラスメソッドを呼び出した場合、
  メソッド内で$thisに代わる自クラス指定の方法はありますか?

2 無い場合、親クラスメソッドから子クラス名を知り、子クラスオブジェクトを
  生成する方法はありますか?

3 そもそも上記の考え方が根本的に間違っていて、他に正当な方法が有る場合、
  そのやり方のヒントを教えて下さい。

以上、どなたかご教授お願い致します。


<? /*********************************
       koga-y @ mcp-net.com
*********************************/ ?>



PHP-users メーリングリストの案内