我有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
课程?
感谢
答案 0 :(得分:17)
您的代码建议您使用parent,这实际上就是您所需要的。问题在于魔术__CLASS__
变量。
从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