アップデート
あなたの質問をもう一度読んだとき、私はあなたが必要としているものにより適した別の方法を考えました。phpは多重継承をサポートしておらず、特性にはphp> = 5.4が必要ですが、2番目の「世代」(別のレベルの子)を追加することを検討することをお勧めします。抽象クラスには、すべての人が利用できるメソッド、できればfinal
キーワードを使用できるメソッド、または1つのバリエーションしかないメソッドのみが含まれます(この場合、final
キーワードを削除してメンバー関数をオーバーライドします)。
前にも言ったように、私はこのことを説明するのが苦手なので、クラスがどのように見えるかの例をまとめました。
abstract class User
{
public function __construct()
{
echo get_class($this).'<br/>';
}
final function forAll()
{
echo 'access for all';
}
}
class TxtGroup extends User
{
public function __construct()
{
parent::__construct();
}
public function abstr()
{
echo 'TxtGroup specific';
}
}
class ImgGroup extends User
{
public function __construct()
{
echo 'Same, but different for ImgGroup<br/>';
parent::__construct();
}
public function abstr()
{
echo 'ImgGroup specific';
}
}
class inst1 extends TxtGroup
{
public function __construct()
{
parent::__construct();
if ($this instanceof TxtGroup)
{
echo 'Child member of: TxtGroup<br/>';
}
if ($this instanceof inst1)
{
echo 'Child instance of inst1 (itself)<br/>';
}
if ($this instanceof User)
{
echo 'grand-Child of User<br/>';
}
}
public function objSpecific()
{
echo 'self explanatory<br/>';
}
}
class inst2 extends ImgGroup
{
public function __construct()
{
parent::__construct();
if ($this instanceof ImgGroup)
{
echo 'Child member of: ImgGroup<br/>';
}
if ($this instanceof inst2)
{
echo 'Child insance of inst2 (itself)<br/>';
}
if ($this instanceof User)
{
echo 'grand-Child of User<br/>';
}
}
}
$foo = new inst1();
$bar = new inst2();
私が何を意味するのか分かりますか?出力:
inst1
子メンバー:TxtGroup
inst1(それ自体)の子インスタンスgrand-
ユーザーの子
同じですが、ImgGroupとは異なります
inst2
子メンバー:ImgGroup
子inst1 (それ自体)の子インスタンスinst1(それ自体)grand-
ユーザーの子
最新バージョンのPHPを使用している場合は、その特性があります。どのクラスがmemberfunctionを呼び出しているかを確認する方法はたくさんあります。最も簡単なIMOは、次の値をチェックしてメソッドを開始することですget_class($this);
。
abstract class Foo
{
public function who()
{
echo get_class($this);
}
}
class bar extends Foo
{
public function __construct()
{
$this->who();
}
}
$f = new bar();
echoのbar
であるため、抽象メソッドを変更し、必要に応じて例外をスローできます。
同じ構造を使用して、次のような(ひどい)例(表示しようとする/)のように、特定のメソッドをオーバーロードできます。
abstract class Foo
{
public function who()
{
$child = explode('_',get_class($this));
if (end($child) === 'whoExec')
{
return $this->whoExec();
}
echo 'this isn\'t for bar the bar instance';
return $this;
}
private function whoExec()
{
if(!strstr('whoExec',get_class($this)))
{
return $this->who();
}
echo 'This methods mimics overloading -sort of';
return $this;
}
}
class bar_whoExec extends Foo
{
public function __construct()
{
$this->who();
}
}
$f = new bar();