Проверка того, является ли класс подклассом другого

Я хочу проверить, является ли класс подклассом другого без создания экземпляра. У меня есть класс, который получает в качестве параметра имя класса, и как часть процесса проверки, я хочу проверить, относится ли это к определенному классу (чтобы предотвратить проблемы безопасности и т. Д.). Любой хороший способ сделать это?

is_subclass_of() будет правильно проверять, расширяет ли класс другой класс, но не вернет true если оба параметра одинаковы ( is_subclass_of('Foo', 'Foo') будет false ).

Простая проверка равенства добавит необходимые вам функции.

 function is_class_a($a, $b) { return $a == $b || is_subclass_of($a, $b); } 

Yup, с отражением

 <?php class a{} class b extends a{} $r = new ReflectionClass( 'b' ); echo "class b " , (( $r->isSubclassOf( new ReflectionClass( 'a' ) ) ) ? "is" : "is not") , " a subclass of a"; 

Проверьте is_subclass_of() . Начиная с PHP5, он принимает оба параметра как строки.

Вы также можете использовать instanceof , он вернет true, если класс или любой из его потомков совпадают.

Вы можете использовать is_a() с третьим параметром $allow_string , который был добавлен в PHP 5.3.9. Он позволяет использовать строку в качестве первого параметра, которая рассматривается как имя класса:

Пример:

 interface I {} class A {} class B {} class C extends A implements I {} var_dump( is_a('C', 'C', true), is_a('C', 'I', true), is_a('C', 'A', true), is_a('C', 'B', true) ); 

Вывод:

 bool(true) bool(true) bool(true) bool(false) 

Демо: http://3v4l.org/pGBkf

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

 class Foo{ function __construct(){ print("This is class Foo<br/>"); } } class Bar extends Foo{ function __construct(){ print("This is class Bar<br/>"); } } $f = new Foo(); $b = new Bar(); print("Is Bar Subclass of Foo : ".is_subclass_of($b,'Foo')."<br/>"); print(is_subclass_of($f,'Bar')); 

– Результат для этого будет:

 This is class Foo This is class Bar Is Bar Subclass of Foo : 1 

Обратите внимание, что для последней строки is_subclass_of($f,'Bar') не будет выводиться вывод, который приведет к сбою в условной проверке.

Если вы хотите увидеть их логические значения, вам нужно использовать var_dump() вместо функции print() .

Пожалуйста, проверьте эту ссылку для получения дополнительной информации.