is_subclass_of

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

is_subclass_of检查对象是否继承或者实现(implement)此类

说明

is_subclass_of(mixed $object_or_class, string $class, bool $allow_string = true): bool

检查指定的 object_or_class 是否继承或者实现(implement) class

参数

object_or_class

类名或者对象实例。如果类不存在,也不会报错。

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 is a subclass of WidgetFactory\n";
} else {
echo
"no, \$WFC is not a subclass of WidgetFactory\n";
}


if (
is_subclass_of($WF, 'WidgetFactory')) {
echo
"yes, \$WF is a subclass of WidgetFactory\n";
} else {
echo
"no, \$WF is not a subclass of WidgetFactory\n";
}


if (
is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
echo
"yes, WidgetFactory_Child is a subclass of WidgetFactory\n";
} else {
echo
"no, WidgetFactory_Child is not a subclass of 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 Implements MyInterface!";
}
}

// 实例化对象
$my_object = new MyClass;

// 自 5.3.7 起可用

// 使用类的对象实例进行检查
if (is_subclass_of($my_object, 'MyInterface')) {
echo
"Yes, \$my_object is a subclass of MyInterface\n";
} else {
echo
"No, \$my_object is not a subclass of MyInterface\n";
}

// 使用字符串类名进行检查
if (is_subclass_of('MyClass', 'MyInterface')) {
echo
"Yes, MyClass is a subclass of MyInterface\n";
} else {
echo
"No, MyClass is not a subclass of MyInterface\n";
}
?>

以上示例会输出:

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

注释

注意:

如果此类不是已知类,使用此函数会使用任何已注册的 autoloader

参见

add a note

User Contributed Notes 9 notes

up
17
gunniboyh at web dot de
17 years ago
is_subclass_of() works also with classes between the class of obj and the superclass.

example:
<?php
class A {};
class
B extends A {};
class
C extends B {};

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

echoes 'true' .
up
10
nicholas at aquarionics dot com
15 years ago
This might be useful to someone, so:

If you're using Autoload, you should be aware that this will attempt to autoload $classname if it isn't already loaded. I discovered this when I had something using is_subclass_of inside an error thrown by autoload, which then recursed until it ran out of memory.
up
2
alan at jynxy.net
5 years ago
The $allow_string parameter is not very clearly documented. When true, it simply allows the first parameter to be the name of a class, instead of an object whose class we are interested in.

Some usage examples:

class parent_class {
// objects and methods ...
}

$possible_child_object = new possible_child_class(); // might be an extension of parent_class

$result = is_subclass_of($possible_child_object, 'parent_class'); // valid
$result = is_subclass_of($possible_child_object, 'parent_class', false); // valid
$result = is_subclass_of('possible_child_class', 'parent_class', true); // valid
$result = is_subclass_of('possible_child_class', 'parent_class', false); // not valid
up
1
Anonymous
1 year ago
You can check if your current class is a child with:

<?php is_subclass_of($this, self::class) ?>

<?php
class a {
public function
check(): bool {
return
is_subclass_of($this, self::class);
}
}

class
b extends a {}

$a = new a();
$b = new b();

echo
$a->check() ? 'Yes' : 'No';
echo
PHP_EOL;
echo
$b->check() ? 'Yes' : 'No';
echo
PHP_EOL;
?>

prints:
No
Yes
up
0
Shane
5 days ago
In addition to Anonymous's post above regarding using this to determine whether your class has been inherited or not, you may also use this in static methods as follows:

<?php
class a {
public static function
check() {
return
is_subclass_of(static::class, self::class);
}
}

class
b extends a {}

echo
a::check() ? "Yes" : "No";
echo
PHP_EOL;
echo
b::check() ? "Yes" : "No";
echo
PHP_EOL;
?>

Prints:
No
Yes
up
-3
kostyl_kostyl gav-gav mail point ru
15 years ago
<?php
interface I {
}
class
A implements I {
}
class
B extends A {
}
if (
is_subclass_of('A', 'I')) {
echo
'good<br>';
}
else {
echo
'bad<br>';
}
if (
is_subclass_of('B', 'I')) {
echo
'good<br>';
}
else {
echo
'bad<br>';
}
if (
is_subclass_of('B', 'A')) {
echo
'good<br>';
}
else {
echo
'bad<br>';
}
?>

result:
bad <- you must to describe intermediate class B to be good
good
good
up
-2
Damien Bezborodov
15 years ago
If you need something similar to is_subclass_of() to determine if a class implements an interface before instantiating it, use reflection:

<?php

interface A_Interface {}
class
A implements A_Interface {}

$reflectionA = new ReflectionClass('A');
var_dump(
$reflectionA->implementsInterface('A_Interface')
);

?>
bool(true)
up
-3
jm
15 years ago
It would appear that is_subclass_of is case insensitive unlike get_class in php5.
i.e.

<?php
class fooBar {}
class
bar extends fooBar {}

assert(get_class(new fooBar()) == "fooBar");
assert(is_subclass_of(new bar(), "foobar") == true);
?>

i run across this while migrating some code from php4 to php5 and the code would only half-the-time break.
up
-7
Ondra Zizka
17 years ago
For PHP4:

<?php
/** Returns whether specified class is subclass of the other class. */
function is_subclass($sClass, $sExpectedParentClass){
do if(
$sExpectedParentClass === $sClass ) return true;
while(
false != ($sClass = get_parent_class($sClass)) );
return
false;
}
// Test:
class A {} class B extends A {} class C extends B {} echo (int) is_subclass('C', 'A');
?>
To Top