Я недавно читал о разнице между is_a()
а также instanceof
Я сейчас пользуюсь get_class
сделать сравнение объектов. Я прочитал это is_a
был объявлен устаревшим, но вернулся по многочисленным просьбам, хотя instanceof
немного быстрее. Когда вы решите использовать каждый из этих вариантов и почему бы не использовать один из других?
if (get_class($var) == 'MyObject')
if ($var instanceof \MyObject)
if (is_a($var, \MyObject))
Это зависит от того, что вы действительно хотите проверить.
get_class проверка покажет вам, принадлежит ли данный объект данному классу. экземпляр Оператор, с другой стороны, скажет вам, если данный объект принадлежит данному классу, ИЛИ имеет этот класс в своем дереве наследования, ИЛИ реализует данный интерфейс.
Некоторые примеры:
class Parent {}
class Child extends Parent {}
$obj = new Child;
var_dump($obj instanceof Parent); // true
var_dump(get_class($obj) === 'Parent'); // false
var_dump($obj instanceof Child); // true
var_dump(get_class($obj) === 'Child'); // true
Таким образом, оба способа могут быть использованы в зависимости от того, что вам нужно.
относительно это(), ведет себя так же, как экземпляр оператор, но, как известно, немного медленнее. В более крупных приложениях разница в производительности будет незначительной.
экземпляр предлагает больше гибкости. В то время как это() принимает строку только в качестве второго аргумента, экземпляр может быть передана строка, идентификатор объекта или класса.
Четвертый вариант:
Если у вас есть контроль над определением объекта, добавьте открытое свойство в определение родительского класса с именем public $_myquirkyparentproperty = true;
затем используйте isset($var->_myquirkyparentproperty)
, Это самая быстрая идентификация объекта в PHP, когда у вас есть контроль над объектами. Добавьте различные свойства к своим родительским и дочерним классам и продолжайте использовать isset (), чтобы различать их.
Вот тест (-> _ srf_object — это мое личное свойство объекта), а $ a — мой объект:
MIN: time ratio (500x), fastest times (least interference)
[1."(isset($a->_srf_object))"] => 1.00x (5.006790161132812E-6)
[2."(get_class($a))"] => 2.62x (1.311302185058594E-5)
Убедитесь, что имя свойства не совпадает со свойствами других классов. Может быть, ваше имя.