2016-11-29 2 views
0

Скажем, у меня есть это:Как проверить, принадлежит ли экземпляр класса к одному из родительских классов, которые находятся на одном уровне?

class Bird{} 
class PrettyBird extends Bird{} 
class UglyBird extends Bird{} 
class Duckling extends UglyBird{} 

и я делаю это:

$bird = new Duckling(); 

ИЛИ

$bird = new UglyBird(); 

Предположим, что в моей вселенной все, что я заинтересован в это, если класс принадлежит UglyBird или PrettyBird. В случае выше, я хочу проверить, принадлежит ли $bird классу UglyBird (super) в обоих случаях выше.

Как?

В настоящее время я могу сделать это

if (get_class($bird) === UglyBird::class 
    or get_class($bird) === Duckling::class) 
    print "MATCH!"; 

но это непрактично. Например, что, если я создаю новый класс, который расширяет UglyBird. Мне придется добавить этот класс в оператор if.

+0

я хотел бы надеяться, что при написании этого вы должны знать, и не нужно, чтобы обнаружить его с помощью кода. –

+1

Вы попробовали 'instanceof? –

ответ

0

Вы можете использовать функцию is_subclass_of:

$bird = new Duckling(); 
$bird2 = new PrettyBird(); 

var_dump(is_subclass_of($bird, 'UglyBird')); // True 
var_dump(is_subclass_of($bird2, 'UglyBird')); // False 

Предположим, у вас есть класс дочерний PrettyBird:

class PrettyDuckling extends PrettyBird{} 

И вы хотите знать, если ребенок PrettyBird подкласс UglyBird:

$bird3 = new PrettyDuckling(); 
var_dump(is_subclass_of($bird3, 'PrettyBird')); // True 
var_dump(is_subclass_of($bird3, 'UglyBird')); // False 

Обратите внимание, что это будет работать для т родителя, а также:

var_dump(is_subclass_of($bird, 'Bird')); // True 
var_dump(is_subclass_of($bird2, 'Bird')); // True 
var_dump(is_subclass_of($bird3, 'Bird')); // True 
2

Вы можете использовать instanceof оператор для этой проверки:

if ($bird instanceof UglyBird) { 
    print "MATCH!"; 
} 

Он будет работать для экземпляров UglyBird и всех унаследованных классов

Проверьте документацию для деталей: http://php.net/manual/en/language.operators.type.php

+0

Я считаю, что это правильный ответ. –

+0

Это работает для всех суперклассов. – Perumal

0

Вы можете использовать get_parent_class function:

class Bird{} 
class PrettyBird extends Bird{} 
class UglyBird extends Bird{} 
class Duckling extends UglyBird{} 

$bird = new Duckling(); 
var_dump(get_parent_class($bird)); 
$bird = new UglyBird(); 
var_dump(get_parent_class($bird)); 

Выход:

string(8) "UglyBird" 
string(4) "Bird" 

Вы можете проверить:

if (get_parent_class(new Duckling()) == get_parent_class(new UglyBird())) { 
    .... 
} 
Смежные вопросы