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' .
(PHP 4, PHP 5, PHP 7, PHP 8)
is_subclass_of — Prüft ob ein Objekt von der angegebenen Klasse abstammt oder sie implementiert
Diese Funktion prüft ob das Objekt objekt
von der Klasse class_name
abstammt oder sie implementiert.
object
Ein Klassenname oder eine Objektinstanz. Es wird kein Fehler generiert, wenn die Klasse nicht existiert.
class_name
Ein Klassenname
allow_string
Wenn dieser Parameter false ist, ist ein Zeichenketten-Klassenname als
object
nicht erlaubt. Dies verhindert ebenso den
Aufruf vom Autoloader, wenn die Klasse nicht existiert.
Die Funktion liefert true
wenn die Klasse des Objekts
object
eine Unterklasse von
class_name
ist, sonst false
.
Beispiel #1 is_subclass_of() Beispiel
<?php
// Definition einer Klasse
class WidgetFactory
{
var $oink = 'moo';
}
// Definition einer Kindklasse
class WidgetFactory_Child extends WidgetFactory
{
var $oink = 'oink';
}
// Erzeugung von Objekten
$WF = new WidgetFactory();
$WFC = new WidgetFactory_Child();
if (is_subclass_of($WFC, 'WidgetFactory')) {
echo "Ja, \$WFC ist eine Unterklasse von WidgetFactory\n";
} else {
echo "Nein, \$WFC ist keine Unterklasse von WidgetFactory\n";
}
if (is_subclass_of($WF, 'WidgetFactory')) {
echo "Ja, \$WF ist eine Unterklasse von WidgetFactory\n";
} else {
echo "Nein, \$WF ist keine Unterklasse von WidgetFactory\n";
}
// ab PHP 5.0.3 funktioniert auch
if (is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
echo "Ja, WidgetFactory_Child ist eine Unterklasse von WidgetFactory\n";
} else {
echo "Nein, WidgetFactory_Child ist keine Unterklasse von WidgetFactory\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Ja, $WFC ist eine Unterklasse von WidgetFactory Nein, $WF ist keine Unterklasse von WidgetFactory Ja, WidgetFactory_Child ist eine Unterklasse von WidgetFactory
Beispiel #2 Verwendung von is_subclass_of() mit einem Interface
<?php
// Definition des Interface
interface MyInterface
{
public function MyFunction();
}
// Definition der Klassenimplementierung des Interface
class MyClass implements MyInterface
{
public function MyFunction()
{
return "MyClass implementiert MyInterface!";
}
}
// Objekt-Erzeugung
$my_object = new MyClass;
// Funktioniert seit 5.3.7
// Prüfung unter Verwendung des Objektexemplars der Klasse
if (is_subclass_of($my_object, 'MyInterface')) {
echo "Ja, \$my_object ist eine Unterklasse von MyInterface\n";
} else {
echo "Nein, \$my_object ist keine Unterklasse von MyInterface\n";
}
// Prüfung unter Verwendung des Klassennamens als Zeichenkette
if (is_subclass_of('MyClass', 'MyInterface')) {
echo "Ja, MyClass ist eine Unterklasse von MyInterface\n";
} else {
echo "Nein, MyClass ist keine Unterklasse von MyInterface\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Ja, $my_object ist eine Unterklasse von MyInterface Ja, MyClass ist eine Unterklasse von MyInterface
Hinweis:
Die Verwendung dieser Funktion wird jegliche registrierte Autoloader verwenden, falls die Klasse nicht bereits bekannt ist.
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');
?>