PHP Conference Japan 2024

is_subclass_of

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

is_subclass_of檢查物件是否繼承自指定的類別或實作該類別

說明

is_subclass_of(混合 $object_or_class, 字串 $class, 布林 $allow_string = true): 布林

檢查指定的 object_or_class 是否將 class 類別作為其父類別之一或實作它。

參數

object_or_class

一個類別名稱或物件實例。如果該類別不存在,也不會產生錯誤。

類別

類別名稱

allow_string

如果這個參數設為 false,則不允許使用字串類別名稱作為 object_or_class 參數。這也可以防止在類別不存在時呼叫自動載入器。

回傳值

如果物件 object_or_class 屬於 class 的子類別,則此函式回傳 true,否則回傳 false

範例

範例 #1 is_subclass_of() 範例

<?php
// 定義一個類別
class WidgetFactory
{
var
$oink = 'moo';
}

// 定義一個子類別
class WidgetFactory_Child extends WidgetFactory
{
var
$oink = 'oink';
}

// 建立一個新的物件
$WF = new WidgetFactory();
$WFC = new WidgetFactory_Child();

if (
is_subclass_of($WFC, 'WidgetFactory')) {
echo
"yes, \$WFC 是 WidgetFactory 的子類別\n";
} else {
echo
"no, \$WFC 不是 WidgetFactory 的子類別\n";
}


if (
is_subclass_of($WF, 'WidgetFactory')) {
echo
"yes, \$WF 是 WidgetFactory 的子類別\n";
} else {
echo
"no, \$WF 不是 WidgetFactory 的子類別\n";
}


if (
is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
echo
"yes, WidgetFactory_Child 是 WidgetFactory 的子類別\n";
} else {
echo
"no, WidgetFactory_Child 不是 WidgetFactory 的子類別\n";
}
?>

上述範例會輸出

yes, $WFC is a subclass of WidgetFactory
no, $WF is not a subclass of WidgetFactory
yes, WidgetFactory_Child is a subclass of WidgetFactory

範例 #2 使用介面的 is_subclass_of() 範例

<?php
// 定義介面
interface MyInterface
{
public function
MyFunction();
}

// 定義實作介面的類別
class MyClass implements MyInterface
{
public function
MyFunction()
{
return
"MyClass 實作了 MyInterface!";
}
}

// 建立物件實例
$my_object = new MyClass;

// 從 5.3.7 版本開始支援

// 使用物件實例進行測試
if (is_subclass_of($my_object, 'MyInterface')) {
echo
"是的,\$my_object 是 MyInterface 的子類別\n";
} else {
echo
"否,\$my_object 不是 MyInterface 的子類別\n";
}

// 使用類別名稱字串進行測試
if (is_subclass_of('MyClass', 'MyInterface')) {
echo
"是的,MyClass 是 MyInterface 的子類別\n";
} else {
echo
"否,MyClass 不是 MyInterface 的子類別\n";
}
?>

上述範例會輸出

Yes, $my_object is a subclass of MyInterface
Yes, MyClass is a subclass of MyInterface

注意事項

備註:

如果類別尚未被載入,使用此函式將會使用任何已註冊的 自動載入器

另請參閱

新增註釋

使用者貢獻的註釋 3 則註釋

gunniboyh at web dot de
18 年前
is_subclass_of() 也適用於物件類別和父類別之間的類別。

範例
<?php
類別 A {};
類別
B 繼承 A {};
類別
C 繼承 B {};

$foo=新 C();
echo ((
is_subclass_of($foo,'A')) ? 'true' : 'false');
?>

會印出 'true'。
nicholas at aquarionics dot com
15 年前
這可能對某些人有用,所以

如果您正在使用自動載入,您應該注意,如果 $classname 尚未載入,這將會嘗試自動載入它。我是在 autoload 拋出的錯誤中使用了 is_subclass_of 時發現了這一點,然後它會遞迴直到記憶體耗盡。
alan at jynxy.net
6 年前
$allow_string 參數的說明文件不夠清楚。當其為 true 時,它允許第一個參數是類別的名稱,而不是我們感興趣的類別的物件。

一些使用範例

類別 parent_class {
// 物件和方法 ...
}

$possible_child_object = 新 possible_child_class(); // 可能是 parent_class 的延伸

$result = is_subclass_of($possible_child_object, 'parent_class'); // 有效
$result = is_subclass_of($possible_child_object, 'parent_class', false); // 有效
$result = is_subclass_of('possible_child_class', 'parent_class', true); // 有效
$result = is_subclass_of('possible_child_class', 'parent_class', false); // 無效
To Top