is_subclass_of

(PHP 4, PHP 5, PHP 7)

is_subclass_ofSprawdza czy klasa jest jednym z rodziców obiektu lub implementuje go

Opis

is_subclass_of ( mixed $obiekt , string $nazwa_klasy [, bool $allow_string = TRUE ] ) : bool

Sprawdza czy podana klasa jest jednym z rodziców obiektu lub implementuje go.

Parametry

obiekt

Nazwa klasy lub instancja obiektu. Nie jest generowany błąd jeśli klasa nie istnieje.

nazwa_klasy

Nazwa klasy.

allow_string

Jeżeli ten parametr jest ustawiony na false, object będący nazwą klasy jest niedozwolony. Zapobiega to także wywołaniu autoloadera jeżeli klasa nie istnieje.

Zwracane wartości

Funkcja zwraca TRUE jeżeli podany obiekt, należy do klasy, która jest podklasą tej podanej jako nazwa_klasy, w przeciwnym wypadku zwraca FALSE.

Rejestr zmian

Wersja Opis
5.3.9 Dodano parametr allow_string
5.3.7 Parametr nazwa_klasy działa z interfejsami
5.0.3 Możesz określić argument obiekt jako string (nazwę klasy)

Przykłady

Przykład #1 Przykład użycia is_subclass_of()

<?php
// zdefiniuj klasę
class WidgetFactory
{
  var 
$oink 'moo';
}

// zdefiniuj klasę potomną
class WidgetFactory_Child extends WidgetFactory
{
  var 
$oink 'oink';
}

// stwórz obiekty
$WF = new WidgetFactory();
$WFC = new WidgetFactory_Child();

if (
is_subclass_of($WFC'WidgetFactory')) {
  echo 
"tak, \$WFC jest klasą potomną WidgetFactory\n";
} else {
  echo 
"nie, \$WFC nie jest klasą potomną WidgetFactory\n";
}


if (
is_subclass_of($WF'WidgetFactory')) {
  echo 
"tak, \$WF jest klasą potomną WidgetFactory\n";
} else {
  echo 
"no, \$WF nie jest klasą potomną WidgetFactory\n";
}


// działa dopiero od PHP 5.0.3
if (is_subclass_of('WidgetFactory_Child''WidgetFactory')) {
  echo 
"tak, WidgetFactory_Child jest klasą potomną WidgetFactory\n";
} else {
  echo 
"nie, WidgetFactory_Child nie jest klasą potomną WidgetFactory\n";
}
?>

Powyższy przykład wyświetli:

tak, $WFC jest klasą potomną WidgetFactory
nie, $WF nie jest klasą potomną WidgetFactory
tak, WidgetFactory_Child jest klasą potomną WidgetFactory

Przykład #2 Przykład użycia interfejsu i is_subclass_of()

<?php
// Zdefiniuj interfejs
interface MyInterface
{
  public function 
MyFunction();
}

// Zdefiniuj klasę implementującą interfejs
class MyClass implements MyInterface
{
  public function 
MyFunction()
  {
    return 
"MyClass implementje MyInterface!";
  }
}

// Utwórz obiekt
$my_object = new MyClass;

// Działa od PHP 5.3.7

// Sprawdź używając instancji obieku klasy
if (is_subclass_of($my_object'MyInterface')) {
  echo 
"Tak, \$my_object jest klasą potomną MyInterface\n";
} else {
  echo 
"Nie, \$my_object nie jest klasą potomną MyInterface\n";
}

// Sprawdź używając nazwy klasy
if (is_subclass_of('MyClass''MyInterface')) {
  echo 
"Tak, MyClass jest klasą potomną MyInterface\n";
} else {
  echo 
"Nie, MyClass nie jest klasą potomną MyInterface\n";
}
?>

Powyższy przykład wyświetli:

Tak, $my_object jest klasą potomną MyInterface
Tak, MyClass jest klasą potomną MyInterface

Notatki

Informacja:

Using this function will use any registered autoloaders if the class is not already known.

Zobacz też:

  • get_class() - Zwraca nazwę klasy danego obiektu
  • get_parent_class() - Zwraca nazwę klasy rodzica dla obiektu lub klasy
  • is_a() - Sprawdza czy obiekt jest instancją tej klasy lub ma tę klasę jako jednego z rodziców
  • class_parents() - Return the parent classes of the given class

add a note add a note

User Contributed Notes 7 notes

up
14
gunniboyh at web dot de
17 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
9
nicholas at aquarionics dot com
15 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
alan at jynxy.net
5 years ago
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
up
0
Damien Bezborodov
15 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
-2
jm
15 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
-5
kostyl_kostyl gav-gav mail point ru
15 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
-6
Ondra Zizka
17 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