ana
ana

Reputation: 998

get parent extends class in php

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

Answers (5)

Rifat
Rifat

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

Ariful Islam
Ariful Islam

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

Robik
Robik

Reputation: 6127

You can use reflection to do that:

Instead of

parent::__CLASS__;

use

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

Upvotes: 10

Jan Dragsbaek
Jan Dragsbaek

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

connec
connec

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

Related Questions