何が起こっているかを示すコードの例を次に示します。
class A {
function __construct(){
echo get_class($this),"\n";
echo self::tellclass();
echo A::tellclass();
}
static function tellclass(){
echo __METHOD__,' ', __CLASS__,"\n";
}
}
class B extends A {
}
class C extends A{
function __construct(){
echo "parent constructor:\n";
parent::__construct();
echo "self constructor:\n";
echo get_class($this),"\n";
echo self::tellclass();
echo C::tellclass();
}
static function tellclass(){
echo __METHOD__, ' ', __CLASS__,"\n";
}
}
$a= new A;
// A
//A::tellclass A
//A::tellclass A
$b= new B;
//B
//A::tellclass A
//A::tellclass A
$c= new C;
//parent constructor:
//C
//A::tellclass A
//A::tellclass A
//self constructor:
//C
//C::tellclass C
//C::tellclass C
要点は、 で定義されたメソッドをA::tellclass()
常に呼び出すことです。ただし、子クラスに独自のバージョンがある場合は、それを使用できます。@One Trick Pony が指摘しているように、遅延静的バインディングも確認する必要があります: http://ca2.php.net/manual/en/language.oop5.late-static-bindings.phptellclass
A
self::tellclass()
tellclass()