is_subclass_of
(PHP 4, PHP 5, PHP 7, PHP 8)
is_subclass_of — 如果此对象是该类的子类,则返回 true
说明
$object
, string $class_name
): bool
如果对象 object
所属类是类 class_name
的子类,则返回 true
,否则返回 false
。
注意:
自 PHP 5.0.3 起也可以用一个字符串来指定
object
参数(类名)。
示例 #1 is_subclass_of() 例子
<?php
// define a class
class WidgetFactory
{
var $oink = 'moo';
}
// define a child class
class WidgetFactory_Child extends WidgetFactory
{
var $oink = 'oink';
}
// create a new object
$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";
}
// usable only since PHP 5.0.3
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
参见 get_class()、 get_parent_class() 和 is_a()。
参数
-
object
-
A class name or an object instance
-
class_name
-
The class name
-
allow_string
-
If this parameter set to false, string class name as
object
is not allowed. This also prevents from calling autoloader if the class doesn't exist.
返回值
This function returns true
if the object object
,
belongs to a class which is a subclass of
class_name
, false
otherwise.
范例
示例 #2 is_subclass_of() example
<?php
// define a class
class WidgetFactory
{
var $oink = 'moo';
}
// define a child class
class WidgetFactory_Child extends WidgetFactory
{
var $oink = 'oink';
}
// create a new object
$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";
}
// usable only since PHP 5.0.3
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
注释
注意:
如果此类不是已知类,使用此函数会使用任何已注册的 autoloader。
参见
- get_class() - 返回对象的类名
- get_parent_class() - 返回对象或类的父类名
- is_a() - 如果对象属于该类或该类是此对象的父类则返回 true
- class_parents() - 返回指定类的父类。

User Contributed Notes 7 notes
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' .
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.
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
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)
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.
<?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
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');
?>
备份地址:http://www.lvesu.com/blog/php/function.is-subclass-of.php