文字

is_subclass_of

(PHP 4, PHP 5, PHP 7)

is_subclass_of如果此对象是该类的子类,则返回 TRUE

说明

bool is_subclass_of ( object $object , string $class_name )

如果对象 object 所属类是类 class_name 的子类,则返回 TRUE ,否则返回 FALSE

Note:

自 PHP 5.0.3 起也可以用一个字符串来指定 object 参数(类名)。

Example #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.

更新日志

版本 说明
5.3.9 Added allow_string parameter
5.0.3 You may also specify the object parameter as a string (the name of the class)

范例

Example #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

注释

Note:

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

参见

  • get_class() - 返回对象的类名
  • get_parent_class() - 返回对象或类的父类名
  • is_a() - 如果对象属于该类或该类是此对象的父类则返回 TRUE
  • class_parents() - 返回指定类的父类。

用户评论:

[#1] nicholas at aquarionics dot com [2009-03-17 13:02:21]

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.

[#2] Damien Bezborodov [2009-03-16 16:55:32]

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 
implements A_Interface {}

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

?>

bool(true)

[#3] kostyl_kostyl gav-gav mail point ru [2009-03-07 15:08:45]

<?php
interface {
}
class 
implements {
}
class 
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

[#4] jm [2008-09-30 20:02:03]

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.

[#5] Ondra Zizka [2006-10-13 05:31:16]

For PHP4:

<?php

function is_subclass($sClass$sExpectedParentClass){
    do if( 
$sExpectedParentClass === $sClass ) return true;
    while( 
false != ($sClass get_parent_class($sClass)) );
    return 
false;
}
// Test:
class {} class extends {} class extends {} echo (int) is_subclass('C''A');
?>

[#6] gunniboyh at web dot de [2006-05-20 06:16:44]

is_subclass_of() works also with classes between the class of obj and the superclass.

example:
<?php
class {};
class 
extends {};
class 
extends {};

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


echoes 'true' .

上一篇: 下一篇: