PHPKonf İstanbul PHP Conference 2015

is_subclass_of

(PHP 4, PHP 5)

is_subclass_ofPrüft ob ein Objekt von der angegebenen Klasse abstammt

Beschreibung

bool is_subclass_of ( mixed $object , string $class_name [, bool $allow_string = TRUE ] )

Diese Funktion prüft ob das Objekt objekt von der Klasse class_name abstammt.

Parameter-Liste

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.

Rückgabewerte

Die Funktion liefert TRUE wenn die Klasse des Objekts object eine Unterklasse von class_name ist, sonst FALSE.

Changelog

Version Beschreibung
5.3.9 allow_string Parameter hinzugefügt
5.3.7 class_name kann nun auch der Name eines Interfaces sein
5.0.3 Als object kann nun auch ein Klassenname anstelle einer Objektinstanz übergeben werden.

Beispiele

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

Anmerkungen

Hinweis:

Die Verwendung dieser Funktion wird jegliche registrierte Autoloader verwenden, falls die Klasse nicht bereits bekannt ist.

Siehe auch

  • get_class() - Ermittelt den Klassennamen eines Objekts
  • get_parent_class() - Gibt den Namen der Elternklasse eines Objektes zurück
  • 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

add a note add a note

User Contributed Notes 6 notes

up
3
gunniboyh at web dot de
9 years ago
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' .
up
2
nicholas at aquarionics dot com
6 years ago
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.
up
1
kostyl_kostyl gav-gav mail point ru
6 years ago
<?php
interface I {
}
class
A implements I {
}
class
B extends {
}
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
up
1
jm
6 years ago
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.
up
0
Damien Bezborodov
6 years ago
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)
up
0
Ondra Zizka
8 years ago
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');
?>
To Top