is_object()
Функция PHP is_object() проверяет, является ли переменная объектом. Синтаксис, возвращаемое значение, отличия от instanceof и типичные ошибки.
Введение
is_object() — встроенная функция PHP, которая проверяет, содержит ли переменная объект — экземпляр какого-либо класса. Она возвращает boolean, поэтому чаще всего используется в инструкции if для защитной проверки перед вызовом метода или обращением к свойству значения с неизвестным типом.
Объект — это значение, созданное из класса с помощью new (или возвращённое фабрикой, драйвером базы данных, json_decode() и т. д.). Вызов метода на значении, которое не является объектом, вызывает фатальную ошибку Error, поэтому предварительная проверка — распространённый защитный паттерн при обработке входных данных неизвестной формы.
Синтаксис
is_object(mixed $value): bool$value— переменная для проверки. Принимается любой тип.- Возвращает
true, если$valueявляется объектом, иfalseдля любого другого типа (string, int, array,nullи т. д.).
Базовый пример
Здесь $obj — экземпляр MyClass, поэтому is_object() возвращает true; $text — строка, поэтому возвращается false.
Почему
var_dump, а неecho? Когда вы выводите boolean черезecho,trueпечатается как1, аfalse— как пустая строка, поэтомуecho is_object($text)выглядит так, словно ничего не вывелось.var_dump()явно показывает тип (bool(true)/bool(false)), что делает проверки типов гораздо нагляднее при изучении.
Защита вызова метода
Наиболее распространённое практическое применение — защита кода, который предполагает наличие объекта:
<?php
function describe($value): string {
if (is_object($value)) {
return "Got an object of class " . get_class($value);
}
return "Not an object: " . gettype($value);
}
echo describe(new MyClass()), "\n"; // Got an object of class MyClass
echo describe("hello"), "\n"; // Not an object: string
echo describe([1, 2, 3]), "\n"; // Not an object: array
?>Сочетание is_object() с get_class() позволяет ветвиться по конкретному типу только тогда, когда это безопасно.
Что считается объектом
Некоторые значения, которые кажутся простыми данными, на самом деле являются объектами в PHP:
<?php
var_dump(is_object((object) ["a" => 1])); // bool(true) — array cast to stdClass
var_dump(is_object(json_decode('{"a":1}'))); // bool(true) — default decode returns an object
var_dump(is_object(fn() => 1)); // bool(true) — closures are Closure objects
var_dump(is_object(null)); // bool(false)
var_dump(is_object([1, 2, 3])); // bool(false) — arrays are NOT objects
?>Последние два — типичные ловушки: null и массивы не являются объектами. Если нужно различать их, используйте is_null() и is_array().
Связанные функции
| Функция | Проверяет |
|---|---|
is_object() | экземпляр объекта |
is_array() | массив |
is_string() | строку |
is_int() | целое число |
is_null() | значение null |
gettype() | возвращает имя типа в виде строки |
Если вам нужна проверка instanceof для конкретного класса, а не «любого объекта», используйте оператор instanceof — is_object() лишь сообщает, что значение является каким-то объектом.
Заключение
is_object() отвечает на один конкретный вопрос: является ли это значение объектом? Используйте её для защиты доступа к методам и свойствам от фатальных ошибок, которые возникают при вызове методов на строках, массивах или null. Помните о сюрпризах — приведения через (object), результаты json_decode() и замыкания являются объектами, тогда как массивы и null — нет. Для проверки конкретного типа используйте instanceof; для получения читаемого имени типа — gettype().