Is subclass of: примеры (PHP)
is_subclass_of(object|string $object_or_class, string $class, bool $allow_string = true): boolФункция is_subclass_of определяет, принадлежит ли объект к подклассу указанного класса или реализует интерфейс. Используется для проверки иерархии наследования и соответствия типов в runtime.
- object_or_class - проверяемый объект или имя класса в виде строки.
- class - имя родительского класса или интерфейса для проверки.
- allow_string (с PHP 7.3.0) - если false, первый параметр принимает только объекты.
class ParentClass {}
class ChildClass extends ParentClass {}
$obj = new ChildClass();
var_dump(is_subclass_of($obj, 'ParentClass'));
var_dump(is_subclass_of($obj, 'SomeClass'));bool(true) bool(false)
var_dump(is_subclass_of('ChildClass', 'ParentClass'));
var_dump(is_subclass_of('ParentClass', 'ParentClass'));bool(true) bool(false)
var_dump(is_subclass_of('ChildClass', 'ParentClass', false));
var_dump(is_subclass_of($obj, 'ParentClass', false));bool(false) bool(true)
Оператор проверяет, является ли объект экземпляром класса или его потомком. Не работает с именами классов в строках.
$obj = new ChildClass();
var_dump($obj instanceof ParentClass);bool(true)
Проверяет, принадлежит ли объект к классу или является его подклассом. Поддерживает строковые аргументы и параметр allow_string.
var_dump(is_a($obj, 'ParentClass'));
var_dump(is_a('ChildClass', 'ParentClass', true));bool(true) bool(true)
Работает только с классами, а не с объектами.
class ParentClass:
pass
class ChildClass(ParentClass):
pass
print(issubclass(ChildClass, ParentClass))
# issubclass(obj, ParentClass) - TypeErrorTrue
Проверяет объекты, но не принимает имена классов как строки.
class ParentClass {}
class ChildClass extends ParentClass {}
const obj = new ChildClass();
console.log(obj instanceof ParentClass);true
var_dump(is_subclass_of('ChildClass', 'UnexistingClass'));PHP Warning: is_subclass_of(): Class UnexistingClass does not exist
var_dump(is_subclass_of(42, 'SomeClass'));bool(false)
$obj = new ParentClass();
var_dump(is_subclass_of($obj, 'ParentClass'));bool(false)
Добавлен параметр allow_string. При установке в false функция не принимает имя класса в качестве первого аргумента.
Функция начала корректно обрабатывать интерфейсы. Ранее проверка is subclass of с интерфейсами могла возвращать неверные результаты.
interface MyInterface {}
class Implementer implements MyInterface {}
$obj = new Implementer();
var_dump(is_subclass_of($obj, 'MyInterface'));
var_dump(is_subclass_of('Implementer', 'MyInterface'));bool(true) bool(true)
abstract class Document {}
class PdfDocument extends Document {}
class WordDocument extends Document {}
function createViewer(string $docClass) {
if (!is_subclass_of($docClass, 'Document')) {
throw new Exception('Неверный тип документа');
}
return new $docClass();
}
try {
$viewer = createViewer('PdfDocument');
echo get_class($viewer);
} catch (Exception $e) {
echo $e->getMessage();
}PdfDocument
class A {}
class B extends A {}
class C extends B {}
$obj = new C();
var_dump(is_subclass_of($obj, 'A'));
var_dump(is_subclass_of($obj, 'B'));
var_dump(is_subclass_of('C', 'A'));bool(true) bool(true) bool(true)
spl_autoload_register(function($class) {
if ($class === 'DynamicClass') {
eval('class DynamicClass extends ParentClass {}');
}
});
var_dump(is_subclass_of('DynamicClass', 'ParentClass'));bool(true)