CakeFest 2024: The Official CakePHP Conference

is_subclass_of

(PHP 4, PHP 5, PHP 7, PHP 8)

is_subclass_ofПроверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс

Описание

is_subclass_of(mixed $object_or_class, string $class, bool $allow_string = true): bool

Проверяет, принадлежит ли объект или класс object_or_class к потомкам класса class, или реализует ли объект или класс, или родители объекта или класса, интерфейс.

Список параметров

object_or_class

Имя класса или экземпляр объекта. Если класс не найден, ошибка не будет выдана.

class

Имя класса.

allow_string

Если для параметра установлено значение false, то функция определит принадлежность типа проверяемого объекта к подтипу класса, только если в параметр object_or_class будет передан экземпляр объекта, а не имя класса. Это также предотвратит вызов автозагрузчика, если класс не найден.

Возвращаемые значения

Возвращает true, если объект или класс object_or_class принадлежит к потомкам класса class, или если объект или класс, или предок объекта или класса, реализует интерфейс, иначе false.

Примеры

Пример #1 Пример использования функции is_subclass_of()

<?php

// Объявить класс
class WidgetFactory
{
var
$oink = 'moo';
}

// Объявить наследника
class WidgetFactory_Child extends WidgetFactory
{
var
$oink = 'oink';
}

// Создать новые объекты
$WF = new WidgetFactory();
$WFC = new WidgetFactory_Child();

if (
is_subclass_of($WFC, 'WidgetFactory')) {
echo
"Да, объект \$WFC наследует класс WidgetFactory\n";
} else {
echo
"Нет, объект \$WFC не наследует класс WidgetFactory\n";
}


if (
is_subclass_of($WF, 'WidgetFactory')) {
echo
"Да, объект \$WF наследует класс WidgetFactory\n";
} else {
echo
"Нет, объект \$WF не наследует класс WidgetFactory\n";
}

if (
is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
echo
"Да, класс WidgetFactory_Child наследует класс WidgetFactory\n";
} else {
echo
"Нет, класс WidgetFactory_Child не наследует класс WidgetFactory\n";
}
?>

Результат выполнения приведённого примера:

Да, объект $WFC наследует класс WidgetFactory
Нет, объект $WF не наследует класс WidgetFactory
Да, класс WidgetFactory_Child наследует класс WidgetFactory

Пример #2 Пример использования функции is_subclass_of() с интерфейсами

<?php

// Определяем интерфейс
interface MyInterface
{
public function
MyFunction();
}

// Определяем реализацию интерфейса классом
class MyClass implements MyInterface
{
public function
MyFunction()
{
return
"Класс MyClass реализует интерфейс MyInterface!";
}
}

// Создаём объект
$my_object = new MyClass;

// Код ниже работает с PHP 5.3.7

// Проверяем экземпляр объекта класса
if (is_subclass_of($my_object, 'MyInterface')) {
echo
"Да, тип экземпляра объекта \$my_object наследует тип интерфейса MyInterface\n";
} else {
echo
"Нет, тип экземпляра объекта \$my_object не наследует тип интерфейса MyInterface\n";
}

// Проверяем строку — имя класса
if (is_subclass_of('MyClass', 'MyInterface')) {
echo
"Да, класс-тип MyClass наследует класс-тип MyInterface\n";
} else {
echo
"Нет, класс-тип MyClass не наследует класс-тип MyInterface\n";
}

?>

Результат выполнения приведённого примера:

Да, тип экземпляра объекта $my_object наследует тип интерфейса MyInterface
Да, класс-тип MyClass наследует класс-тип MyInterface

Примечания

Замечание:

Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс ещё не известен.

Смотрите также

  • get_class() - Возвращает имя класса, которому принадлежит объект
  • get_parent_class() - Получает имя родительского класса для объекта или класса
  • is_a() - Проверяет, принадлежит ли объект к типу или подтипу
  • class_parents() - Возвращает список родительских классов заданного класса

add a note

User Contributed Notes 9 notes

up
17
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
10
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
2
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
1
Anonymous
1 year ago
You can check if your current class is a child with:

<?php is_subclass_of($this, self::class) ?>

<?php
class a {
public function
check(): bool {
return
is_subclass_of($this, self::class);
}
}

class
b extends a {}

$a = new a();
$b = new b();

echo
$a->check() ? 'Yes' : 'No';
echo
PHP_EOL;
echo
$b->check() ? 'Yes' : 'No';
echo
PHP_EOL;
?>

prints:
No
Yes
up
0
Shane
4 days ago
In addition to Anonymous's post above regarding using this to determine whether your class has been inherited or not, you may also use this in static methods as follows:

<?php
class a {
public static function
check() {
return
is_subclass_of(static::class, self::class);
}
}

class
b extends a {}

echo
a::check() ? "Yes" : "No";
echo
PHP_EOL;
echo
b::check() ? "Yes" : "No";
echo
PHP_EOL;
?>

Prints:
No
Yes
up
-3
kostyl_kostyl gav-gav mail point ru
15 years ago
<?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
up
-2
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
-3
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
-7
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