【问题标题】:Checking if a class is a subclass of another检查一个类是否是另一个类的子类
【发布时间】:2010-10-21 10:12:18
【问题描述】:

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

【问题讨论】:

  • 这个写法让人迷惑,问题其实是为了确定一个类是否是另一个类的子类。

标签: php class oop inheritance


【解决方案1】:

is_subclass_of() 将正确检查一个类是否扩展另一个类,但如果两个参数相同则不会返回trueis_subclass_of('Foo', 'Foo') 将是false)。

简单的相等性检查将添加您需要的功能。

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

【讨论】:

  • is_a() 适用于对象的实例,而不是类本身的名称。
  • 这不适用于相对命名空间的类。例如,is_class_a('stdClass','\stdClass') 将返回 FALSE,即使它们是一回事。
  • 使用instanceof 按照@sirlancelot 在stackoverflow.com/a/782741/467386 下方的回答
【解决方案2】:

是的,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() 与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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 2013-04-09
        • 2018-07-31
        相关资源
        最近更新 更多