在php中获取父扩展类

时间:2011-11-26 14:35:58

标签: php class parent extend

我有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课程?

感谢

5 个答案:

答案 0 :(得分:17)

您的代码建议您使用parent,这实际上就是您所需要的。问题在于魔术__CLASS__变量。

documentation州:

  

从PHP 5开始,这个常量返回声明的类名。

我们需要的是什么,但正如php.net上的this comment所述:

  

claude注意到__CLASS__总是包含调用它的类,如果你想让调用方法的类改为使用get_class($ this)。但是,这仅适用于实例,而不适用于静态调用。

如果你只需要父类,那么它也是一个功能。那个被称为get_parent_class

答案 1 :(得分:16)

您可以使用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)代替。

答案 2 :(得分:11)

class a {
  // with propertie and functions
}

class b extends a {

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


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

答案 3 :(得分:10)

你可以使用反射来做到这一点:

而不是

parent::__CLASS__;

使用

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

答案 4 :(得分: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