Как лучше всего определить, является ли переменная конкретным объектом?

Я недавно читал о разнице между is_a() а также instanceof
Я сейчас пользуюсь get_class сделать сравнение объектов. Я прочитал это is_a был объявлен устаревшим, но вернулся по многочисленным просьбам, хотя instanceof немного быстрее. Когда вы решите использовать каждый из этих вариантов и почему бы не использовать один из других?

if (get_class($var) == 'MyObject')

if ($var instanceof \MyObject)

if (is_a($var, \MyObject))

1

Решение

Это зависит от того, что вы действительно хотите проверить.

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

Таким образом, оба способа могут быть использованы в зависимости от того, что вам нужно.

относительно это(), ведет себя так же, как экземпляр оператор, но, как известно, немного медленнее. В более крупных приложениях разница в производительности будет незначительной.

экземпляр предлагает больше гибкости. В то время как это() принимает строку только в качестве второго аргумента, экземпляр может быть передана строка, идентификатор объекта или класса.

1

Другие решения

Четвертый вариант:

Если у вас есть контроль над определением объекта, добавьте открытое свойство в определение родительского класса с именем 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)

Убедитесь, что имя свойства не совпадает со свойствами других классов. Может быть, ваше имя.

1

По вопросам рекламы [email protected]