检查类是否是另一个类的子类

时间:2009-04-23 17:01:07

标签: php class oop inheritance

我想在不创建实例的情况下检查某个类是否是另一个类的子类。我有一个类作为参数接收类名,作为验证过程的一部分,我想检查它是否属于特定的类系列(以防止安全问题等)。这样做有什么好办法吗?

5 个答案:

答案 0 :(得分:32)

is_subclass_of()会正确检查类是否扩展另一个类,但如果两个参数相同,则不会返回trueis_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)

演示:http://3v4l.org/pGBkf

答案 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()函数。

Please check this link for more information