Проверка того, является ли класс подклассом другого
Я хочу проверить, является ли класс подклассом другого без создания экземпляра. У меня есть класс, который получает в качестве параметра имя класса, и как часть процесса проверки, я хочу проверить, относится ли это к определенному классу (для предотвращения проблем безопасности и т.д.). Любой хороший способ сделать это?
Ответы
Ответ 1
is_subclass_of()
будет корректно проверять, расширяет ли класс другой класс, но не возвратит true
, если оба параметра одинаковы (is_subclass_of('Foo', 'Foo')
будет false
).
Простая проверка равенства добавит необходимые вам функции.
function is_class_a($a, $b)
{
return $a == $b || is_subclass_of($a, $b);
}
Ответ 2
Yup, с Reflection
<?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";
Ответ 3
Отъезд is_subclass_of()
. Начиная с PHP5, он принимает оба параметра как строки.
Вы также можете использовать instanceof
, он вернет true, если класс или любой из его потомков совпадают.
Ответ 4
Вы можете использовать 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
Ответ 5
Вам нужно использовать функцию 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()
.
Для получения дополнительной информации см. эту ссылку