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.
is_subclass_of
(PHP 4, PHP 5)
is_subclass_of — Checks if the object has this class as one of its parents
Description
Checks if the given object has the class
class_name as one of its parents.
Parameters
-
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.
Return Values
This function returns TRUE if the object object,
belongs to a class which is a subclass of
class_name, FALSE otherwise.
Changelog
| Version | Description |
|---|---|
| 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)
|
Examples
Example #1 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";
}
?>
The above example will output:
yes, $WFC is a subclass of WidgetFactory no, $WF is not a subclass of WidgetFactory yes, WidgetFactory_Child is a subclass of WidgetFactory
Notes
Note:
Using this function will use any registered autoloaders if the class is not already known.
See Also
- get_class() - Returns the name of the class of an object
- get_parent_class() - Retrieves the parent class name for object or class
- is_a() - Checks if the object is of this class or has this class as one of its parents
- class_parents() - Return the parent classes of the given class
nicholas at aquarionics dot com
17-Mar-2009 08:02
Damien Bezborodov
16-Mar-2009 11:55
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)
kostyl_kostyl gav-gav mail point ru
07-Mar-2009 09:08
<?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
jm
30-Sep-2008 03:02
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.
Ondra Zizka
13-Oct-2006 12:31
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');
?>
gunniboyh at web dot de
20-May-2006 01:16
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' .
01-Oct-2005 01:32
this function does not check interfaces, unlike instanceof operator.
youcantryreachingme at REMOVEME dot hotmail dot com
21-Mar-2005 12:15
A bug report at http://pear.php.net/bugs/bug.php?id=2975 indicates that the "is_subclass_of" function can return the error message:
Warning: Unknown class passed as parameter
in the event that the class represented by the second argument hasn't yet been instantiated.
