is_subclass_of() 也適用於物件類別和父類別之間的類別。
範例
<?php
類別 A {};
類別 B 繼承 A {};
類別 C 繼承 B {};
$foo=新 C();
echo ((is_subclass_of($foo,'A')) ? 'true' : 'false');
?>
會印出 'true'。
(PHP 4, PHP 5, PHP 7, PHP 8)
is_subclass_of — 檢查物件是否繼承自指定的類別或實作該類別
檢查指定的 object_or_class
是否將 class
類別作為其父類別之一或實作它。
object_or_class
一個類別名稱或物件實例。如果該類別不存在,也不會產生錯誤。
類別
類別名稱
allow_string
如果這個參數設為 false,則不允許使用字串類別名稱作為 object_or_class
參數。這也可以防止在類別不存在時呼叫自動載入器。
範例 #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
備註:
如果類別尚未被載入,使用此函式將會使用任何已註冊的 自動載入器。
is_subclass_of() 也適用於物件類別和父類別之間的類別。
範例
<?php
類別 A {};
類別 B 繼承 A {};
類別 C 繼承 B {};
$foo=新 C();
echo ((is_subclass_of($foo,'A')) ? 'true' : 'false');
?>
會印出 'true'。
這可能對某些人有用,所以
如果您正在使用自動載入,您應該注意,如果 $classname 尚未載入,這將會嘗試自動載入它。我是在 autoload 拋出的錯誤中使用了 is_subclass_of 時發現了這一點,然後它會遞迴直到記憶體耗盡。
$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); // 無效