Оператор 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() больше не является устаревшей.
Ознакомьтесь также с описанием функций get_class() и is_a().