Оператор проверки типа в PHP
Оператор instanceof используется для определения того, является ли текущий объект экземпляром указанного класса.
Пример #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. Константы, тем не менее, не допускаются.
Пример #6 Пример использования оператора instanceof для проверки других переменных
<?php $a = 1; $b = NULL; $c = imagecreate(5, 5); 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 5.1.0, instanceof вызывал __autoload() если имя класса не существовало. Вдобавок, если класс не был загружен, происходила фатальная ошибка. Это можно было обойти с помощью динамической ссылки на класс или использования строковой переменной с именем класса:
Пример #7 Избежание поиска класса и фатальных ошибок с instanceof в PHP 5.0
<?php $d = 'NotMyClass'; var_dump($a instanceof $d); // нет фатальной ошибки ?>
Результат выполнения данного примера:
bool(false)
Оператор instanceof был добавлен в PHP 5. До этого времени использовалась функция is_a(), но позже is_a() была помечена устаревшей в пользу instanceof. Учтите, что с версии PHP 5.3.0, is_a() больше не является устаревшей.