PHP 5.6.0 released

get_parent_class

(PHP 4, PHP 5)

get_parent_classRetourne le nom de la classe parente d'un objet

Description

string get_parent_class ([ mixed $object ] )

Récupère le nom de la classe parente pour un objet ou une classe.

Liste de paramètres

object

L'objet ou le nom de la classe testé

Valeurs de retour

Retourne le nom de la classe parente dont object est une instance ou le nom.

Note:

Si l'objet n'a pas de parent ou si la classe fournie n'existe pas, FALSE sera retourné.

Si appelée sans paramètre en dehors d'un objet, cette fonction retourne FALSE.

Historique

Version Description
5.1.0 Si appelée sans paramètre en dehors de l'objet, cette fonction aurait retourné NULL avec une alerte, mais retourne maintenant FALSE.
5.0.0 Le paramètre object est optionnel si cette fonction est appelée depuis une méthode d'un objet.
4.0.5 Si le paramètre object est une chaîne, get_parent_class() retourne le nom de la classe parente de celle portant ce nom.

Exemples

Exemple #1 Exemple avec get_parent_class()

<?php

class papa {
    function 
papa()
    {
    
// un peu de code
    
}
}

class 
enfant extends papa {
    function 
enfant()
    {
        echo 
"je suis le fils de " get_parent_class($this) , "\n";
    }
}

class 
enfant2 extends papa {
    function 
enfant2()
    {
        echo 
"Je suis aussi le fils de " get_parent_class('enfant2') , "\n";
    }
}

$foo = new enfant();
$bar = new enfant2();

?>

L'exemple ci-dessus va afficher :

je suis le fils de papa
Je suis aussi le fils de papa

Voir aussi

  • get_class() - Retourne le nom de la classe d'un objet
  • is_subclass_of() - Détermine si un objet est une sous-classe d'une classe donnée

add a note add a note

User Contributed Notes 10 notes

up
1
levu
3 years ago
I wrote a simple function doing the reverse thing: get the children:

<?php
function get_child($instance, $classname) {
   
$class = $classname;
   
$t = get_class($instance);
    while ((
$p = get_parent_class($t)) !== false) {
        if (
$p == $class) {
            return
$t;
        }
       
$t = $p;
    }
    return
false;
}

abstract class
A {
    function
someFunction() {
        return
get_child($this, __CLASS__);
    }
}

class
B extends A {

}

class
C extends B {

}

$c = new C();
echo
$c->someFunction(); //displays B

?>
up
0
falundir at gmail dot com
2 years ago
You can use this function to find common parent of multiple objects or classes.

<?php
/**
* Returns name of the first (in class hierarchy) common parent class of all provided objects or classes.
* Returns FALSE when common class is not found.
*
* @param mixed $objects Array that can contain objects or class names.
* @return mixed
*/
function get_first_common_parent($objects) {
   
$common_ancestors = null;
    foreach(
$objects as $object) {
        if (
is_object($object)) {
           
$class_name = get_class($object);
        } else {
           
$class_name = $object;
        }
       
       
$parent_class_names = array();
       
$parent_class_name = $class_name;
        do {
           
$parent_class_names[] = $parent_class_name;
        } while(
$parent_class_name = get_parent_class($parent_class_name));
       
        if (
$common_ancestors === null) {
           
$common_ancestors = $parent_class_names;
        } else {
           
$common_ancestors = array_intersect($common_ancestors, $parent_class_names);
        }
    }
   
    return
reset($common_ancestors);
}
?>

Example:

<?php
class A {
}

    class
B extends A {
    }
   
        class
D extends B {
        }
       
        class
E extends B {
        }

    class
C extends A {
    }

        class
F extends C {
        }
   
            class
G extends F {
            }

class
H {
}

//returns "A"
get_first_common_parent(array('G', 'E'));

//returns "F"
get_first_common_parent(array(new G(), 'F'));

//returns false (no common parent)
get_first_common_parent(array('C', 'H'));

//returns false (non-existent class provided)
get_first_common_parent(array(new B(), 'X'));
?>
up
0
michael at getsprink dot -- com
5 years ago
This little snippet to get the inheritance tree might be useful to someone.

<?php

header
("Content-Type: text/plain;");

class
Top {
  public function
getParents($class=null, $plist=array()) {
   
$class = $class ? $class : $this;
   
$parent = get_parent_class($class);
    if(
$parent) {
     
$plist[] = $parent;
     
/*Do not use $this. Use 'self' here instead, or you
       * will get an infinite loop. */
     
$plist = self::getParents($parent, $plist);
    }
    return
$plist;
  }
}

class
Middle extends Top {
 
}

class
Bottom extends Middle {
 
}

$o = new Bottom();
print_r($o->getParents());

?>
up
0
ssb45 at cornell dot edu
6 years ago
"'If called without parameter outside object' What on earth does that mean?"

There are two places this could be called:
1. From within a member function of an object.  In this case, it may be called with no parameters and will return the parent class of the object owning the member function.  (If the parameter is included, then it will return the parent class of the specified class as normal.)

2. From outside an object (i.e., global or function scope).  In this case, PHP doesn't know what class you're talking about if you don't include a parameter, so it returns FALSE.  (But, of course, it works if you specify the class with the parameter.)
up
0
marcus at synchromedia dot co dot uk
6 years ago
"If called without parameter outside object" What on earth does that mean?

What I can tell you, and that is not documented, is that if the object in question does not have an explicitly declared parent class, it does return boolean false. It doesn't for example return 'stdClass' on the basis that all objects are derived from that.
up
0
birkholz at web dot de
8 years ago
tim at correctclick dot com wrote:
<quote>
A slightly more cryptic but faster get_ancestors function:

<?php
function get_ancestors ($class) {
         
     for (
$classes[] = $class; $class = get_parent_class ($class); $classes[] = $class);
     return
$classes;
     
}
?>
(The second part of the for is implicitly testing for $class != "").  Recursion is considerably slower than looping, so you probably want to use this function.

Hope someone finds it useful.
</quote>

I would prefer this version, because it will create no duplicates:
<?php
function get_ancestors ($class) {
   
$classes = array($class);
    while(
$class = get_parent_class($class)) { $classes[] = $class; }
    return
$classes;
}

Greets, Dennis
?>
up
0
matt-php at DONT-SPAM-ME dot bitdifferent dot com
9 years ago
PHP (4 at least, dunno about 5) stores classnames in lower case, so:

<?PHP

class Foo
{
}

class
Bar extends Foo
{
}

echo
get_parent_class('Bar');

echo
"\n";

echo
get_parent_class('bar');

?>

will output:

foo
foo
up
0
radu dot rendec at ines dot ro
10 years ago
If the argument obj is a string and the class is not defined, then the function returns FALSE.

If the argument obj is an object created from a class with no ancestors (or a string representing a class with no ancestors), then the function returns FALSE.
up
0
tim at correctclick dot com
11 years ago
A slightly more cryptic but faster get_ancestors function:

function get_ancestors ($class) {
           
      for ($classes[] = $class; $class = get_parent_class ($class); $classes[] = $class);
      return $classes;
       
}

(The second part of the for is implicitly testing for $class != "").  Recursion is considerably slower than looping, so you probably want to use this function.

Hope someone finds it useful.
up
-1
eric dot brison at anakeen dot com
12 years ago
To return all ancestors class of an object

function get_ancestors_class($classname) {
  $father = get_parent_class($classname);

  if ($father != "") {

    $ancestors = get_ancestors_class($father);
    $ancestors[] = $father;
  }
  return $ancestors;
}

example :
-----------
Class C  {

}

Class B extends C {

}

Class A extends B {

}
print_r (get_ancestors_class("a"));
print_r (get_ancestors_class("b"));

example result :
---------------
Array
(
    [0] => c
    [1] => b
)
Array
(
    [0] => c
)
To Top