2016-05-13 2 views
1

Я недавно прочитал о разнице между 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 Проверка сообщит вам, если данный объект данного класса. instanceof оператор, с другой стороны, скажет вам, если данный объект имеет данный класс ИЛИ имеет этот класс в дереве наследования или реализует данный интерфейс.

Некоторые примеры:

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 

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

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

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

+1

Или реализует интерфейс .. – dbf

1

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

Если у вас есть контроль над определением объекта, а затем добавить общественное свойство вашего определения родительского класса с именем public $_myquirkyparentproperty = true;, а затем использовать isset($var->_myquirkyparentproperty). Это самый быстрый идентификатор объекта в PHP, когда вы контролируете объекты. Добавьте различные свойства в родительский и дочерний классы и продолжайте использовать isset() для их дифференциации.

Вот тест (-> _ srf_object мой личный объект недвижимости), а $ а мой объект:

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) 

Убедитесь, что имя свойства что-то, что не конфликтует со свойствами других классов. Возможно, ваше имя.

Смежные вопросы