0

何らかのアクションを実行するために、子クラスの名前を親クラスに戻す必要がある状況があります。

現時点で私が設定した方法は次のとおりです。

class SomeParentClass {

    public function __construct($c = false){
        ...
    }

}

class SomeChildClass extends SomeParentClass {

    public function __construct(){
        parent::__construct(__CLASS__){
            ...
        }
    }

}

これにより、子クラスの名前が親に戻されますが、子クラスがこれを行わない場合、変数$cは bool 値を保持しますfalse

それは機能し、理にかなっていますが、これはこれを行う最もクリーンな方法ですか? parent::__construct()変数として渡さずにどの子クラスが呼び出されたかを自動検出する方法はありますか?

どうもありがとう

4

3 に答える 3

2

これは、PHP 5のget_called_class()(http://php.net/manual/en/function.get-called-class.php )を使用して行うことができます。

参照:親クラスの子クラスの名前の取得(静的コンテキスト)

于 2012-05-11T12:34:24.237 に答える
2
<?php
class SomeParentClass {

    public function __construct($c = false){       
        echo get_called_class();
    }

}

class SomeChildClass extends SomeParentClass {

    public function __construct(){
        parent::__construct(__CLASS__);       
    }

}

class OtherChildClass extends SomeParentClass {
    public function __construct(){
        parent::__construct(__CLASS__);  
    }

}

$a = new SomeChildClass();
$b = new OtherChildClass();
于 2012-05-11T12:39:18.690 に答える
1

私は間違っているかもしれませんが、通常の状況では、親はその子クラスを認識するべきではありません。あなたがやろうとしていることを行うためのより良い方法があると確信しています。

この「ルール」の例外は、おそらく、静的 (オプションで最終) コンストラクターを公開する基本クラスであり、子クラスを前に付けて呼び出されます。

class Parent
{
    public final static function create()
    {
        return new static;
    }
}

class Child extends Parent
{
    public function __construct()
    {
        // special code here
    }
}

var_dump(Child::create());
于 2012-05-11T12:40:30.687 に答える