1

以下代码中的注释显示了我要完成的工作,这非常简单:我希望能够使用 PHP 内置常量(或其他构造)来引用父类的名称,例如__CLASS__, 但是它指的是父类而不是当前类(例如parent::__CLASS__)(另外,虽然代码没有显示它,但如果我有一个子类,那么在这样的类中,我希望能够通过类似parent::parent::__CLASS__if的方式引用父类尽可能)。

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
4

2 回答 2

1

你需要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));
}
于 2015-02-08T23:54:07.303 回答
1

在 PHP 5.5 中,您可以使用关键字::class来检索类的父级名称,但它只能在 a) 类内部和 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) {
    ...
}
于 2015-02-08T23:58:37.507 回答