get_parent_class

(PHP 4, PHP 5, PHP 7, PHP 8)

get_parent_class检索对象或类的父类名称

描述

get_parent_class(object|string $object_or_class = ?): string|false

检索对象或类的父类名称。

参数

object_or_class

要测试的对象或类名。

返回值

返回 object_or_class 实例或名称所属类的父类名称。

如果对象没有父类或给定的类不存在,将返回 false

变更日志

版本 描述
8.3.0 现在,在没有参数的情况下调用 get_parent_class() 会发出 E_DEPRECATED 警告;以前,在类内部调用此函数会返回该类的名称。
8.0.0 object_or_class 参数现在仅接受对象或有效的类名。

示例

示例 #1 使用 get_parent_class()

<?php

class Dad {
function
__construct()
{
// 实现一些逻辑
}
}

class
Child extends Dad {
function
__construct()
{
echo
"我 是 " , get_parent_class($this) , "的儿子\n";
}
}

class
Child2 extends Dad {
function
__construct()
{
echo
"我 也是 " , get_parent_class('child2') , "的儿子\n";
}
}

$foo = new child();
$bar = new child2();

?>

上面的例子将输出

I'm Dad's son
I'm Dad's son too

参见

添加注释

用户贡献的注释 7 个注释

7
yukal dot alexander at gmail dot com
5 年前
使用闭包、递归和 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'));

输出是
Sub7 > Sub6 > Sub5 > Sub4 > Sub3 > Sub2 > SubChild > Child > ParentClass
Sub3 > Sub2 > SubChild > Child > ParentClass
1
jake at qzdesign dot co dot uk
4 年前
请注意,从 PHP 5.5 开始,您还可以从方法内部使用 `parent::class`,例如

<?php
function child()
{
echo
"我 是 ", parent::class, "的儿子\n";
}
?>

看起来更简洁,从技术上讲可能也更优化,因为它避免了函数调用查找。
1
falundir at gmail dot com
12 年前
您可以使用此函数查找多个对象或类的共同父类。

<?php
/**
* 返回所有提供的对象或类的第一个(在类层次结构中)共同父类名称。
* 当找不到共同类时返回 FALSE。
*
* @param mixed $objects 可以包含对象或类名的数组。
* @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);
}
?>

例子

<?php
A {
}

B 扩展 A {
}

D 扩展 B {
}

E 扩展 B {
}

C 扩展 A {
}

F 扩展 C {
}

G 扩展 F {
}

H {
}

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

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

// 返回 false (没有共同的父类)
get_first_common_parent(array('C', 'H'));

// 返回 false (提供的类不存在)
get_first_common_parent(array(new B(), 'X'));
?>
1
levu
13 年前
我写了一个简单的函数来做相反的事情:获取子类

<?php
函数 get_child($instance, $classname) {
$class = $classname;
$t = get_class($instance);
当 ((
$p = get_parent_class($t)) !== false) {
如果 (
$p == $class) {
返回
$t;
}
$t = $p;
}
返回
false;
}

抽象类
A {
函数
someFunction() {
返回
get_child($this, __CLASS__);
}
}

B 扩展 A {

}

C 扩展 B {

}

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

?>
0
ssb45 at cornell dot edu
16 年前
"'如果在对象外部调用且没有参数' 这到底是什么意思?"

有两个地方可以调用它
1. 从对象的成员函数内部调用。在这种情况下,它可以不带参数调用,并将返回拥有成员函数的对象的父类。(如果包含参数,则它将像往常一样返回指定类的父类。)

2. 从对象外部调用(即全局或函数作用域)。在这种情况下,如果你没有包含参数,PHP 就不知道你在谈论哪个类,所以它返回 FALSE。(但是,当然,如果你用参数指定了类,它就可以正常工作。)
0
matt-php at DONT-SPAM-ME dot bitdifferent dot com
19 年前
PHP (至少是 4,不知道 5) 以小写字母存储类名,所以

<?PHP

Foo
{
}

Bar 扩展 Foo
{
}

echo
get_parent_class('Bar');

echo
"\n";

echo
get_parent_class('bar');

?>

将输出

foo
foo
-1
radu dot rendec at ines dot ro
20 年前
如果参数 obj 是一个字符串并且该类没有定义,则函数返回 FALSE。

如果参数 obj 是从一个没有祖先的类创建的对象(或者表示一个没有祖先的类的字符串),则函数返回 FALSE。
To Top