PHP Conference Japan 2024

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 条注释

yukal dot alexander at gmail dot com
6 年前
使用闭包、递归和面向对象编程输出整个继承链

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
jake at qzdesign dot co dot uk
5 年前
请注意,从 PHP 5.5 开始,您还可以使用方法中的 `parent::class`,例如:

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

看起来更简洁,而且技术上可能更优化,因为它避免了函数调用的查找。
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(数组('G', 'E'));

//返回 "F"
get_first_common_parent(数组(新的 G(), 'F'));

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

//返回 false (提供的类不存在)
get_first_common_parent(数组(新的 B(), 'X'));
?>
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 = 新 C();
输出
$c->someFunction(); //显示 B

?>
ssb45 at cornell dot edu
16年前
"“如果在对象外部无参数调用” 这到底是什么意思?"

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

2. 在对象外部(即全局或函数范围)。在这种情况下,如果您不包含参数,PHP 就不知道您指的是哪个类,因此它返回 FALSE。(但是,如果您使用参数指定类,它当然可以工作。)
matt-php at DONT-SPAM-ME dot bitdifferent dot com
20年前
PHP(至少4,不知道5)以小写形式存储类名,因此

<?PHP

Foo
{
}

Bar 继承 Foo
{
}

输出
get_parent_class('Bar');

输出
"\n";

输出
get_parent_class('bar');

?>

将输出

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

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