PHP Conference Japan 2024

get_parent_class

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

get_parent_class取得物件或類別的父類別名稱

說明

get_parent_class(物件|字串 $object_or_class = ?): 字串|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
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 {
}

//傳回 "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'));
?>
levu
13 年前
我寫了一個簡單的函式來做相反的事情:取得子類別

<?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(); // 顯示 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

class Foo
{
}

class
Bar extends Foo
{
}

echo
get_parent_class('Bar');

echo
"\n";

echo
get_parent_class('bar');

?>

將輸出

foo
foo
radu dot rendec at ines dot ro
20 年前
如果參數 obj 是字串且未定義該類別,則該函式將返回 FALSE。

如果參數 obj 是從沒有祖先的類別建立的物件(或代表沒有祖先的類別的字串),則該函式將返回 FALSE。
To Top