更新
在第二次阅读您的问题时,我刚刚想到了另一种更适合您需要的方法。尽管 php 不支持多重继承,并且特征需要 php >= 5.4,但您可能需要考虑添加第二个“代”(另一个级别的子级)。抽象类只包含那些对所有人都可用的方法,最好是带有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 的
子实例(本身)
用户
的孙子 相同,但与 ImgGroup 不同 inst2
子成员:ImgGroup
inst1的子实例(自身)
用户
的孙子
如果您使用的是最新版本的 PHP,那么您就有了相应的特征。有很多方法可以检查哪个类正在调用成员函数。最简单的 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's 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();