Reputation: 998
i have the oop php code:
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();
I have a few parent class (normal and abstract) and many child classes. The child classes extend the parent classes. So when I instantiate the child at some point I need to find out what parent I called.
for example the function b::test()
will return a
How can I get (from my code) the class a
from my class b?
thanks
Upvotes: 13
Views: 7150
Reputation: 7728
Use class_parents
instead. It'll give an array of 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
Upvotes: 7
Reputation: 7675
class a {
// with propertie and functions
}
class b extends a {
public function test() {
echo get_parent_class($this);
}
}
$b = new b();
$b->test();
Upvotes: 11
Reputation: 6127
You can use reflection to do that:
Instead of
parent::__CLASS__;
use
$ref = new ReflectionClass($this);
echo $ref->getParentClass()->getName();
Upvotes: 10
Reputation: 8101
Your code suggested you used parent, which in fact is what you need. The issue lies with the magic __CLASS__
variable.
The documentation states:
As of PHP 5 this constant returns the class name as it was declared.
Which is what we need, but as noted in this comment on php.net:
claude noted that
__CLASS__
always contains the class that it is called in, if you would rather have the class that called the method use get_class($this) instead. However this only works with instances, not when called statically.
If you only are in need of the parent class, theres a function for that aswell. That one is called get_parent_class
Upvotes: 17
Reputation: 7421
You can use get_parent_class
:
class A {}
class B extends A {
public function test() {
echo get_parent_class();
}
}
$b = new B;
$b->test(); // A
This will also work if B::test
is static.
NOTE: There is a small difference between using get_parent_class
without arguments versus passing $this
as an argument. If we extend the above example with:
class C extends B {}
$c = new C;
$c->test(); // A
We get A
as the parent class (the parent class of B, where the method is called). If you always want the closest parent for the object you're testing you should use get_parent_class($this)
instead.
Upvotes: 17