is_subclass_of()
(PHP 4, PHP 5, PHP 7)
如果此对象是该类的子类,则返回TRUE
说明
is_subclass_of(object $object,string $class_name): bool
如果对象$object所属类是类$class_name的子类,则返回TRUE
,否则返回FALSE
。
Note:自 PHP 5.0.3 起也可以用一个字符串来指定$object参数(类名)。
Example #1is_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$objectis not allowed. This also prevents from calling autoloader if the class doesn't exist.
返回值
This function returnsTRUE
if the object$object, belongs to a class which is a subclass of$class_name,FALSE
otherwise.
更新日志
版本 | 说明 |
---|---|
5.3.9 | Added$allow_stringparameter |
5.0.3 | You may also specify the$objectparameter as a string (the name of the class) |
范例
Example #2is_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()
如果对象属于该类或该类是此对象的父类则返回 TRUEclass_parents()
返回指定类的父类。
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
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.
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)
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'); ?>
<?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