通过魔术常量/关键字或类似结构引用 PHP superclass 名称(避免在派生的 class 中命名 superclass)
Referring to a PHP superclass name via a magic constant / keyword or similar construct (avoiding naming the superclass in the derived class)
以下代码中的注释显示了我正在努力完成的事情,这非常简单:我希望能够使用 PHP 来引用父 class 的名称内置常量(或其他构造),例如 __CLASS__
,但它指的是父 class 而不是当前的 class(例如 parent::__CLASS__
)(同时,代码没有显示它,如果我有一个 subsubclass,那么在这样的 class 中,我希望能够通过 parent::parent::__CLASS__
之类的东西引用父 class 如果在一切皆有可能)。
class ParentClass {
protected $foo;
function __construct() {
$this->foo = "hello";
}
}
class DerivedClass extends ParentClass {
public $bar;
public $baz;
function __construct($bar) {
// I want to be able to write
// something like parent:__CLASS__
// here in place of 'ParentClass'
// so that no matter what I rename
// the parent class, this line will
// always work. Is this possible?
// if (is_a($bar, parent::__CLASS__)) {
if (is_a($bar, 'ParentClass')) {
$this->bar = $bar;
} else {
die("Unexpected.");
}
$this->baz = "world";
}
public function greet() {
return $this->bar->foo . " " . $this->baz;
}
}
$d = new DerivedClass(new ParentClass());
echo $d->greet();
输出:
hello world
你需要 get_parent_class
函数来完成它。
function __construct($bar) {
$parent = get_parent_class($this);
if (is_a($bar, $parent)) {
$this->bar = $bar;
} else {
die("Unexpected.");
}
$this->baz = "world";
}
如果您需要进一步降低级别,您可以使用:
class subDerivedClass extents DerivedClass{
$superParent = get_parent_class(get_parent_class($this));
}
在 PHP 5.5 中,您可以使用关键字 ::class
检索 class' 父项的名称,但它只能在 a) class 和 b) 只有一级,即直接父祖先:
function __construct($bar) {
if ($bar instanceof parent::class) {
...
}
}
我想要的最佳解决方案是链接 get_parent_class
:
if ($bar instanceof get_parent_class(get_parent_class())) {
...
}
或通过反射链接方法:
$parent_class = (new Reflection($this))->getParentClass()->getParentClass()->getName();
if ($bar instanceof $parent_class) {
...
}
以下代码中的注释显示了我正在努力完成的事情,这非常简单:我希望能够使用 PHP 来引用父 class 的名称内置常量(或其他构造),例如 __CLASS__
,但它指的是父 class 而不是当前的 class(例如 parent::__CLASS__
)(同时,代码没有显示它,如果我有一个 subsubclass,那么在这样的 class 中,我希望能够通过 parent::parent::__CLASS__
之类的东西引用父 class 如果在一切皆有可能)。
class ParentClass {
protected $foo;
function __construct() {
$this->foo = "hello";
}
}
class DerivedClass extends ParentClass {
public $bar;
public $baz;
function __construct($bar) {
// I want to be able to write
// something like parent:__CLASS__
// here in place of 'ParentClass'
// so that no matter what I rename
// the parent class, this line will
// always work. Is this possible?
// if (is_a($bar, parent::__CLASS__)) {
if (is_a($bar, 'ParentClass')) {
$this->bar = $bar;
} else {
die("Unexpected.");
}
$this->baz = "world";
}
public function greet() {
return $this->bar->foo . " " . $this->baz;
}
}
$d = new DerivedClass(new ParentClass());
echo $d->greet();
输出:
hello world
你需要 get_parent_class
函数来完成它。
function __construct($bar) {
$parent = get_parent_class($this);
if (is_a($bar, $parent)) {
$this->bar = $bar;
} else {
die("Unexpected.");
}
$this->baz = "world";
}
如果您需要进一步降低级别,您可以使用:
class subDerivedClass extents DerivedClass{
$superParent = get_parent_class(get_parent_class($this));
}
在 PHP 5.5 中,您可以使用关键字 ::class
检索 class' 父项的名称,但它只能在 a) class 和 b) 只有一级,即直接父祖先:
function __construct($bar) {
if ($bar instanceof parent::class) {
...
}
}
我想要的最佳解决方案是链接 get_parent_class
:
if ($bar instanceof get_parent_class(get_parent_class())) {
...
}
或通过反射链接方法:
$parent_class = (new Reflection($this))->getParentClass()->getParentClass()->getName();
if ($bar instanceof $parent_class) {
...
}