代码之家  ›  专栏  ›  技术社区  ›  AriehGlazer

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

  •  19
  • AriehGlazer  · 技术社区  · 16 年前

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

    5 回复  |  直到 8 年前
        1
  •  32
  •   Alex Barrett    16 年前

    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
  •  13
  •   Peter Bailey    16 年前

    是的,带着 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
  •  11
  •   matpie    16 年前

    退房 is_subclass_of() . 从php5开始,它接受两个参数作为字符串。

    您也可以使用 instanceof ,如果类 它的任何后代都匹配。

        4
  •  7
  •   Fabian Schmengler    9 年前

    你可以使用 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
  •  0
  •   user2819304    8 年前

    您需要使用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