проверить класс объекта php
Проверить класс объекта php
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
is_a — Проверяет, принадлежит ли объект к данному классу или является ли этот класс одним из его родителей
Описание
Проверяет, принадлежит ли объект object_or_class к данному классу или является ли этот класс одним из его родителей.
Список параметров
Имя класса или объект
Возвращаемые значения
Примеры
Пример #1 Пример использования is_a()
// создание нового объекта
$WF = new WidgetFactory ();
Пример #2 Использование оператора instanceof
Смотрите также
User Contributed Notes 7 notes
Please note that you have to fully qualify the class name in the second parameter.
A use statement will not resolve namespace dependencies in that is_a() function.
namespace foo \ bar ;
class A <>;
class B extends A <>;
?>
namespace har \var;
use foo \ bar \ A ;
$foo = new foo \ bar \ B ();
Be careful! Starting in PHP 5.3.7 the behavior of is_a() has changed slightly: when calling is_a() with a first argument that is not an object, __autoload() is triggered!
In practice, this means that calling is_a(’23’, ‘User’); will trigger __autoload() on «23». Previously, the above statement simply returned ‘false’.
Whether this change is considered a bug and whether it will be reverted or kept in future versions is yet to be determined, but nevertheless it is how it is, for now.
At least in PHP 5.1.6 this works as well with Interfaces.
interface test <
public function A ();
>
class TestImplementor implements test <
public function A () <
print «A» ;
>
>
$testImpl = new TestImplementor ();
is_a returns TRUE for instances of children of the class.
class Dog extends Animal
<>
In this example is_a($test, «Animal») would evaluate to TRUE as well as is_a($test, «Dog»).
This seemed intuitive to me, but did not seem to be documented.
It took some time to find out how the last parameter should be used. Please consider the following example
I just want to point out that you can replace «is_a()» function with the «instanceof» operator, BUT you must use a variable to pass the class name string.
This will work:
= new \ stdClass ();
$class_name = ‘\stdClass’ ;
Проверить класс объекта php
Оператор instanceof используется для определения того, является ли текущий объект экземпляром указанного класса.
Пример #1 Использование instanceof с классами
class NotMyClass
<
>
$a = new MyClass ;
Результат выполнения данного примера:
Оператор instanceof также может быть использован для определения, наследует ли определённый объект какой-либо класс:
Пример #2 Использование instanceof с наследуемыми классами
class MyClass extends ParentClass
<
>
Результат выполнения данного примера:
Пример #3 Использование instanceof для проверки того, что объект не является экземпляром класса
Результат выполнения данного примера:
Наконец, instanceof может быть также использован для проверки реализации объектом некоторого интерфейса:
Пример #4 Использование instanceof с интерфейсами
class MyClass implements MyInterface
<
>
Результат выполнения данного примера:
Хотя instanceof обычно используется с прямо указанным именем класса, он также может быть использован с другим объектом или строковой переменной:
Пример #5 Использование instanceof с другими переменными
class MyClass implements MyInterface
<
>
$a = new MyClass ;
$b = new MyClass ;
$c = ‘MyClass’ ;
$d = ‘NotMyClass’ ;
Результат выполнения данного примера:
Пример #6 Пример использования оператора instanceof для проверки других переменных
Результат выполнения данного примера:
Пример #7 Использование instanceof для проверки констант
Результат выполнения данного примера в PHP 7.3:
Смотрите также
User Contributed Notes 23 notes
Checking an object is not an instance of a class, example #3 uses extraneous parentheses.
You are also able to compare 2 objects using instanceOf. In that case, instanceOf will compare the types of both objects. That is sometimes very useful:
$a = new A ;
$b = new B ;
$a2 = new A ;
I don’t see any mention of «namespaces» on this page so I thought I would chime in. The instanceof operator takes FQCN as second operator when you pass it as string and not a simple class name. It will not resolve it even if you have a `use MyNamespace\Bar;` at the top level. Here is what I am trying to say:
You can use «self» to reference to the current class:
If you want to test if a classname is an instance of a class, the instanceof operator won’t work.
Response to vinyanov at poczta dot onet dot pl:
You mentionned «the instanceof operator will not accept a string as its first operand». However, this behavior is absolutely right and therefore, you’re misleading the meaning of an instance.
I believe asking if «a ClassA belongs to a ClassB» (or «a ClassA is a class of (type) ClassB») or even «a ClassA is (also) a ClassB» is more appropriate. But the first is not implemented and the second only works with objects, just like the instanceof operator.
Finally, here is a fast (to me) sample function code to verify if an object or class:
The first parameter must be an object instance.
example:
class A <>
class B extends A <>
var_dump ( A ::class instanceof B ); // false
var_dump ( B ::class instanceof A ); // false
var_dump (new B () instanceof A ); // true
You will have to do:
Example #5 could also be extended to include.
var_dump($a instanceof MyInterface);
The new result would be
The PHP parser generates a parse error on either of the two lines that are commented out here.
Apparently the ‘instanceof’ construct will take a string variable in the second spot, but it will NOT take a string. lame
SIMPLE, CLEAN, CLEAR use of the instanceof OPERATOR
?>
Now instantiate a few instances of these types. Note, I will put them in an array (collection) so we can iterate through them quickly.
?>
$myCollection[0] = 123
$myCollection[1] = abc
$myCollection[2] = Hello World!
$myCollection[3] = Circle [radius=3]
$myCollection[4] = Circle [radius=4]
$myCollection[5] = Circle [radius=5]
$myCollection[6] = Point [x=6, y=6]
$myCollection[7] = Point [x=7, y=7]
$myCollection[8] = Point [x=8, y=8]
?>
Consider it an alternative to «get_class($bar) == get_class($foo)» that avoids the detour through to string lookups and comparisons.
if you have only class names (not objects) you can use that snippet: https://3v4l.org/mUKUC
interface i <>
class a implements i <>
var_dump ( a ::class instanceof i ); // false
var_dump ( in_array ( i ::class, class_implements ( a ::class), true )); // true
Using an undefined variable will result in an error.
If variable is in doubt, one must prequalify:
Cross version function even if you are working in php4
(instanceof is an undefined operator for php4)
instanceof is a binary operator, and so used in binary terms like this
terma instanceof termb
And a term never consists of an operator, only! There is no such construct in any language (please correct me!). However, instanceof doesn’t finally support nested terms in every operand position («terma» or «termb» above) as negation does:
Оператор проверки типа
Оператор instanceof используется для определения того, является ли текущий объект экземпляром указанного класса.
Пример #1 Использование instanceof с классами
class NotMyClass
<
>
$a = new MyClass ;
Результат выполнения данного примера:
Оператор instanceof также может быть использован для определения, наследует ли определенный объект какому-либо классу:
Пример #2 Использование instanceof с наследуемыми классами
class MyClass extends ParentClass
<
>
Результат выполнения данного примера:
Для проверки непринадлежности объекта некоторому классу, используйте логический оператор not.
Пример #3 Использование instanceof для проверки того, что объект не является экземпляром класса
Результат выполнения данного примера:
Ну и наконец, instanceof может быть также использован для проверки реализации объектом некоторого интерфейса:
Пример #4 Использование instanceof для класса
class MyClass implements MyInterface
<
>
Результат выполнения данного примера:
Хотя instanceof обычно используется с прямо указанным именем класса, он также может быть использован с другим объектом или строковой переменной:
Пример #5 Использование instanceof с другими переменными
class MyClass implements MyInterface
<
>
$a = new MyClass ;
$b = new MyClass ;
$c = ‘MyClass’ ;
$d = ‘NotMyClass’ ;
Результат выполнения данного примера:
Пример #6 Пример использования оператора instanceof для проверки других переменных
Результат выполнения данного примера:
Есть несколько подводных камней, которых следует остерегаться. До версии PHP 5.1.0, instanceof вызывал __autoload() если имя класса не существовало. Вдобавок, если класс не был загружен, происходила фатальная ошибка. Это можно было обойти с помощью динамической ссылки на класс или использования строковой переменной с именем класса:
Пример #7 Избежание поиска класса и фатальных ошибок с instanceof в PHP 5.0
Результат выполнения данного примера:
Проверить класс объекта php
Reg.ru: домены и хостинг
Крупнейший регистратор и хостинг-провайдер в России.
Более 2 миллионов доменных имен на обслуживании.
Продвижение, почта для домена, решения для бизнеса.
Более 700 тыс. клиентов по всему миру уже сделали свой выбор.
Бесплатный Курс «Практика HTML5 и CSS3»
Освойте бесплатно пошаговый видеокурс
по основам адаптивной верстки
на HTML5 и CSS3 с полного нуля.
Фреймворк Bootstrap: быстрая адаптивная вёрстка
Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.
Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.
Верстайте на заказ и получайте деньги.
Что нужно знать для создания PHP-сайтов?
Ответ здесь. Только самое важное и полезное для начинающего веб-разработчика.
Узнайте, как создавать качественные сайты на PHP всего за 2 часа и 27 минут!
Создайте свой сайт за 3 часа и 30 минут.
После просмотра данного видеокурса у Вас на компьютере будет готовый к использованию сайт, который Вы сделали сами.
Вам останется лишь наполнить его нужной информацией и изменить дизайн (по желанию).
Изучите основы HTML и CSS менее чем за 4 часа.
После просмотра данного видеокурса Вы перестанете с ужасом смотреть на HTML-код и будете понимать, как он работает.
Вы сможете создать свои первые HTML-страницы и придать им нужный вид с помощью CSS.
Бесплатный курс «Сайт на WordPress»
Хотите освоить CMS WordPress?
Получите уроки по дизайну и верстке сайта на WordPress.
Научитесь работать с темами и нарезать макет.
Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!
Хотите изучить JavaScript, но не знаете, как подступиться?
После прохождения видеокурса Вы освоите базовые моменты работы с JavaScript.
Развеются мифы о сложности работы с этим языком, и Вы будете готовы изучать JavaScript на более серьезном уровне.
*Наведите курсор мыши для приостановки прокрутки.
PHP: Получение информации об объекте или классе, методах, свойствах и наследовании
Получение информации об объекте или классе
Как вы знаете, с помощью уточнений типов классов можно ограничить тип аргумента для метода некоторого объекта. Но, увы, даже используя эту возможность, не всегда можно быть уверенным в отношении типа объекта.
Существует ряд основных средств для проверки типа объекта. Прежде всего, мы можем узнать класс объекта с помощью функции get_class(). В качестве аргумента ей передается объект любого типа, а она возвращает в виде строки его имя класса.
В данном фрагменте кода мы получаем что-то от функции getProduct(). Чтобы быть абсолютно уверенными, что это объект типа CdProduct, мы используем функцию get_class().
Ниже привожу определение функции getProduct().
Как видите, функция getProduct() просто создает экземпляр объекта СdProduct и возвращает его. Вскоре мы воспользуемся этой функцией.
Допустим, мы хотим убедиться, что объект принадлежит семейству ShopProduct, но при этом не имеет значения, к какому классу конкретно: BookProduct или CdProduct. Для этой цели в PHP предусмотрен оператор instanceof.
Работает он с двумя операндами: объектом, который нужно проверить (указывается слева от ключевого слова instanceof), и именем класса или интерфейса справа.
Оператор возвращает значение true, если объект является экземпляром класса указанного типа.
Получение информации о методах
Иногда бывает нужно получить список всех методов класса. Для этого нужно воспользоваться функцией get_class_methods(). В качестве аргумента ей передается имя класса, а она возвращает массив, содержащий имена всех методов класса.
Предполагая, что класс CdProduct существует, получим такой результат.
C таким же успехом мы могли бы передать функции get_class_methods() не только класс, но и конкретный объект.
Как мы знаем, можно сохранить имя объекта в строковой переменной и вызвать его динамически вместе с объектом следующим образом.
Всё вроде бы неплохо, однако такой подход таит в себе определенную опасность. Что произойдет, если метода не существует? Очевидно, сценарий завершится ошибкой. У нас уже есть опыт проверки того, существует ли метод.
Прежде, чем вызвать метод, мы проверяем, есть ли его имя в массиве, возвращенном функцией get_class_methods(). Неплохое решение, однако в PHP для этой цели уже изобретен другой «велосипед»)
В качестве первого аргумента ей передается строковая переменная, определяющая имя функции. Если заданная функция существует и ее можно вызвать, функция is_callable() возвращает значение true.
Функция вернет значение true, если указанный метод существует в классе.
Функции method_exists() передается ссылка на объект (или имя класса) и имя метода, а она возвращает значение true, если заданный метод существует в классе объекта.
Важно!
То, что метод существует, еще не означает, что его можно вызвать. функция method_exists() возвращает значение true для всех методов: закрытых (private), защищенных (protected) и, конечно же, общедоступных (public).
Получение информации о свойствах
Точно так же, как можно запросить список методов класса, можно запросить и список его свойств. Функции get_class_vars() передается имя класса, а она возвращает ассоциативный массив.
Давайте выполним проверку объекта CdProduct. Для наглядности добавим к классу общедоступное свойство: CdProduct::$coverUrl.
В результате вызова
будет показано только общедоступное свойство.
Получение информации о наследовании
С помощью функций для работы с классами можно также выявлять отношения наследования.
Например, с помощью функции get_parent_class() можно узнать имя родительского класса для указанного класса.
Этой функции передается ссылка на объект или имя класса, а она возвращает имя родительского класса (суперкласса), если таковой существует. Если же такого класса нет, то функция вернет значение false. В результате вызова
мы получим имя родительского класса ShopProduct, как и можно было ожидать.
С помощью функции is_subclass_of() можно также проверить, является ли класс дочерним для другого класса.
Этой функции передается ссылка на дочерний объект и имя родительского класса. Функция возвращает значение true, если второй класс является суперклассом первого аргумента.
Кроме того, можно воспользоваться функцией call_implements(), которая является частью SPL (Standard PHP Library). Этой функции передается имя класса или ссылка на объект, а она возвращает массив имен интерфейсов.
Ну вот мы и разобрались с тем, как получать информацию об объекте или классе, методах, свойствах и наследовании. Увидимся в новых материалах.
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
class_exists
(PHP 4, PHP 5, PHP 7, PHP 8)
class_exists — Проверяет, был ли объявлен класс
Описание
Эта функция проверяет, был ли объявлен указанный класс или нет.
Список параметров
Имя класса. Воспринимается без учёта регистра.
Вызывать ли по умолчанию __autoload.
Возвращаемые значения
Примеры
Пример #1 Пример использования class_exists()
// Проверяем существование класса перед его использованием
if ( class_exists ( ‘MyClass’ )) <
$myclass = new MyClass ();
>
Пример #2 Пример использования c параметром autoload
if ( class_exists ( MyClass ::class)) <
$myclass = new MyClass ();
>
Смотрите также
User Contributed Notes 9 notes
use a\namespaced\classname as coolclass;
class_exists( ‘coolclass’ ) => false
If you recursively load several classes inside an autoload function (or mix manual loading and autoloading), be aware that class_exists() (as well as get_declared_classes()) does not know about classes previously loaded during the *current* autoload invocation.
Apparently, the internal list of declared classes is only updated after the autoload function is completed.
Beware: class_exists is case-INsensitive, as is class instantiation.
(tested with PHP 5.5.10 on Linux)
This can cause some headaches in correlating class names to file names, especially on a case-sensitive file system.
If you are checking if a class exists that is in a specific namespace then you have to pass in the full path to the class:
I’m running PHP 5.3.4 on Windows 7 and had some difficulty autoloading classes using class_exists(). In my case, when I checked for the class and it didn’t exist, class_exists automatically threw a system Exception. I was also throwing my own exception resulting in an uncaught exception.
If you have a directory of classes you want to create. (Modules in my instance). you can do it like that
If spl_autoload_register() had been called, then function will try autoload class if it does not exists.