在PHP中获取父类的扩展类

13

我有一个 OOP PHP 代码:

class a {
    // with properties and functions
}

class b extends a {
    public function test() {
        echo __CLASS__; // this is b
        // parent::__CLASS__ // error
    }
}

$b = new b();
$b->test();

我有几个父类(普通和抽象)和许多子类。子类扩展了父类。因此,当我在某个时刻实例化子级时,我需要找出调用的父级。

例如,函数b::test()将返回a

从我的代码中如何获取a类,它是由我的b类调用的?

谢谢


4
请阅读此链接:https://dev59.com/OXRB5IYBdhLWcg3wz6QJ该链接讨论如何从扩展类的静态调用中获取类名。 - Book Of Zeus
5个回答

17

您的代码建议使用parent,这实际上是您需要的。问题出在神奇的__CLASS__变量上。

文档中指出:

自PHP5起,此常量将返回类名的声明方式。

这正是我们需要的,但如php.net上的该评论所述:

claude指出,如果您更喜欢使用调用方法的类而不是包含它的类,请改用get_class($this)。然而,这仅适用于实例,而不能在静态调用时使用。

如果您只需要父类,也有一个函数可以实现。那个叫做get_parent_class


17

你可以使用get_parent_class

class A {}
class B extends A {
  public function test() {
    echo get_parent_class();
  }
}

$b = new B;
$b->test(); // A

如果B::test是静态的,这也将起作用。

注意:使用没有参数的get_parent_class与传递$this作为参数之间有一些小差异。如果我们通过以下方式扩展上面的示例:

class C extends B {}

$c = new C;
$c->test(); // A

我们将A作为父类(B的父类,在该方法被调用时)。如果您始终希望获取测试对象的最近父类,则应改用get_parent_class($this)


11
class a {
  // with propertie and functions
}

class b extends a {

   public function test() {
      echo get_parent_class($this);
   }
}


$b = new b();
$b->test();

10
你可以使用反射来完成这个操作:
而不是
parent::__CLASS__;

使用

$ref = new ReflectionClass($this);
echo $ref->getParentClass()->getName();

6
请使用class_parents代替。它将返回一个父类的数组。
<?php
class A {}
class B extends A {
}
class C extends B {
    public function test() {
        echo implode(class_parents(__CLASS__),' -> ');
    }
}

$c = new C;
$c->test(); // B -> A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接