我想在不创建实例的情况下检查某个类是否是另一个类的子类。我有一个类作为参数接收类名,作为验证过程的一部分,我想检查它是否属于特定的类系列(以防止安全问题等)。这样做有什么好办法吗?
答案 0 :(得分:32)
is_subclass_of()
会正确检查类是否扩展另一个类,但如果两个参数相同,则不会返回true
(is_subclass_of('Foo', 'Foo')
将为{ {1}})。
简单的相等检查将添加您需要的功能。
false
答案 1 :(得分:13)
是的,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";
答案 2 :(得分:11)
结帐is_subclass_of()
。从PHP5开始,它将两个参数都接受为字符串。
您也可以使用instanceof
,如果或类的任何后代匹配,它将返回true。
答案 3 :(得分:7)
您可以将is_a()
与PHP 5.3.9中添加的第三个参数$allow_string
一起使用。它允许将字符串作为第一个参数,将其视为类名:
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)
答案 4 :(得分:0)
你需要使用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()
函数。