Оператор проверки принадлежности типу

Оператор 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().

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