• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • get_parent_class()

    (PHP 4, PHP 5, PHP 7)

    返回对象或类的父类名

    说明

    get_parent_class([mixed $obj]): string

    如果$obj是对象,则返回对象实例$obj所属类的父类名。

    如果$obj是字符串,则返回以此字符串为名的类的父类名。此功能是在 PHP 4.0.5 中增加的。

    Note:

    自 PHP 5 起,如果在对象的方法内调用,则$obj为可选项。

    使用get_parent_class()

    <?php
    class dad {
        function dad()
        {
        // implements some logic
        }
    }
    class child extends dad {
        function child()
        {
            echo "I'm " , get_parent_class($this) , "'s son\n";
        }
    }
    class child2 extends dad {
        function child2()
        {
            echo "I'm " , get_parent_class('child2') , "'s son too\n";
        }
    }
    $foo = new child();
    $bar = new child2();
    ?>
    

    以上例程会输出:

    I'm dad's son
    I'm dad's son too
    

    参见get_class()和is_subclass_of()。

    参数

    $object

    The tested object or class name

    返回值

    Returns the name of the parent class of the class of which$objectis an instance or the name.

    Note:

    If the object does not have a parent or the class given does not existFALSEwill be returned.

    If called without parameter outside object, this function returnsFALSE.

    更新日志

    版本说明
    Before 5.1.0If called without parameter outside object, this function would have returnedNULLwith a warning.
    Since 5.0.0The$objectparameter is optional if called from the object's method.
    Since 4.0.5If$objectis a string, returns the name of the parent class of the class with that name.

    范例

    Usingget_parent_class()

    <?php
    class dad {
        function dad()
        {
        // implements some logic
        }
    }
    class child extends dad {
        function child()
        {
            echo "I'm " , get_parent_class($this) , "'s son\n";
        }
    }
    class child2 extends dad {
        function child2()
        {
            echo "I'm " , get_parent_class('child2') , "'s son too\n";
        }
    }
    $foo = new child();
    $bar = new child2();
    ?>
    

    以上例程会输出:

    I'm dad's son
    I'm dad's son too
    

    参见

    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'));
    ?>
    
    An output of the entire inheritance chain using closures, recursion, and OOP
    class ParentClass {
      public static function getChain() {
        $chain = null;
        return $function = function($className='') use (& $chain, & $function) {
          if (empty($className))
            $className = static::class;
          if (empty($chain))
            $chain = $className;
          $parent = get_parent_class($className);
          if ($parent !== false) {
            $chain .= " > {$parent}";
            return $function($parent);
          }
          return $chain;
        };
      }
    }
    class Child extends ParentClass {}
    class SubChild extends Child {}
    class Sub2 extends SubChild {}
    class Sub3 extends Sub2 {}
    class Sub4 extends Sub3 {}
    class Sub5 extends Sub4 {}
    class Sub6 extends Sub5 {}
    class Sub7 extends Sub6 {}
    printf("%s\n", Sub7::getChain()());
    $getChain = Sub7::getChain();
    printf("%s\n", $getChain('Sub3'));
    Output is:
    Sub7 > Sub6 > Sub5 > Sub4 > Sub3 > Sub2 > SubChild > Child > ParentClass
    Sub3 > Sub2 > SubChild > Child > ParentClass
    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
    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
    ?>
    
    Note that from PHP 5.5 you can also use `parent::class` from within a method, e.g.
    <?php
      function child()
      {
        echo "I'm ", parent::class, "'s son\n";
      }
    ?>
    Looks a bit tidier and technically probably more optimal, as it avoids a function call lookup.
    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.
    "'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.)