Оператор instanceof определяет,
содержит ли PHP-переменная экземпляр объекта
конкретного класса.
Пример #1 Проверка принадлежности объекта классу оператором instanceof
<?php
class MyClass {}
class NotMyClass {}
$a = new MyClass();
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>Результат выполнения приведённого примера:
bool(true) bool(false)
Оператор instanceof также определяет,
принадлежит ли объект, который хранит переменная, классу-наследнику:
Пример #2 Проверка принадлежности объекта класса-наследника супертипу оператором instanceof
<?php
class ParentClass {}
class MyClass extends ParentClass {}
$a = new MyClass();
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>Результат выполнения приведённого примера:
bool(true) bool(true)
Для проверки непринадлежности объекта классу
указывают логический оператор not.
Пример #3
Проверка непринадлежности объекта экземпляру класса оператором instanceof с оператором логического не
<?php
class MyClass {}
$a = new MyClass();
var_dump(!($a instanceof stdClass));
?>Результат выполнения приведённого примера:
bool(true)
Наконец, оператор instanceof также проверяет,
реализует ли объект интерфейс:
Пример #4 Проверка принадлежности типа объекта интерфейсу оператором instanceof
<?php
interface MyInterface {}
class MyClass implements MyInterface {}
$a = new MyClass();
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>Результат выполнения приведённого примера:
bool(true) bool(true)
Оператор instanceof чаще указывают с буквальным названием класса,
но оператор также работает с переменной объекта или строковой переменной:
Пример #5 Проверка принадлежности объекта типу оператором instanceof с другими переменными
<?php
interface MyInterface {}
class MyClass implements MyInterface {}
$a = new MyClass();
$b = new MyClass();
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // Переменная $b — объект класса MyClass
var_dump($a instanceof $c); // Переменная $c — строка 'MyClass'
var_dump($a instanceof $d); // Переменная $d — строка 'NotMyClass'
?>Результат выполнения приведённого примера:
bool(true) bool(true) bool(false)
Оператор instanceof не выбрасывает ошибок, если проверяемая переменная —
не объект, оператор только вернёт значение false. Проверка принадлежности констант, однако,
до PHP 7.3.0 выбрасывала фатальную ошибку.
Пример #6 Проверка принадлежности классу переменных других типов оператором instanceof
<?php
$a = 1;
$b = NULL;
$c = fopen('/tmp/', 'r');
var_dump($a instanceof stdClass); // Переменная $a — целое типа integer
var_dump($b instanceof stdClass); // Переменная $b — NULL
var_dump($c instanceof stdClass); // Переменная $c — значение с типом resource
var_dump(FALSE instanceof stdClass);
?>Результат выполнения приведённого примера:
bool(false) bool(false) bool(false) PHP Fatal error: instanceof expects an object instance, constant given
Начиная с PHP 7.3.0 константы в левой части оператора instanceof стали допустимыми.
Пример #7 Проверка принадлежности типа константы классу оператором instanceof
<?php
var_dump(FALSE instanceof stdClass);
?>Результат выполнения приведённого примера в PHP 7.3:
bool(false)
Начиная с PHP 8.0.0 оператор instanceof разрешили
указывать с произвольными выражениями.
Требования к выражению: записывается в круглых скобках и возвращает значение с типом string.
Пример #8
Пример работы оператора instanceof с произвольным выражением
<?php
class ClassA extends \stdClass {}
class ClassB extends \stdClass {}
class ClassC extends ClassB {}
class ClassD extends ClassA {}
function getSomeClass(): string
{
return ClassA::class;
}
var_dump(new ClassA instanceof ('std' . 'Class'));
var_dump(new ClassB instanceof ('Class' . 'B'));
var_dump(new ClassC instanceof ('Class' . 'A'));
var_dump(new ClassD instanceof (getSomeClass()));
?>Результат выполнения приведённого примера в PHP 8:
bool(true) bool(true) bool(false) bool(true)
Оператор instanceof аналогичен функции is_a().