【问题标题】:How can I test if a class instance belongs to one of the parent classes that are on the same level?如何测试一个类实例是否属于同一级别的父类之一?
【发布时间】:2017-04-14 03:28:30
【问题描述】:

说我有这个:

class Bird{}
class PrettyBird extends Bird{}
class UglyBird extends Bird{}
class Duckling extends UglyBird{}

我这样做:

$bird = new Duckling();

$bird = new UglyBird();

假设在我的世界中,我感兴趣的只是类是否属于UglyBirdPrettyBird。在上述情况下,我想在上述两种情况下测试$bird 是否属于UglyBird(超)类。

怎么做?

目前我可以做到这一点

if (get_class($bird) === UglyBird::class 
    or get_class($bird) === Duckling::class)
    print "MATCH!";

但这是不切实际的。例如,如果我创建一个扩展 UglyBird 的新类会怎样。我必须将该类添加到if 语句中。

【问题讨论】:

  • 我希望在写这篇文章的时候你会知道并且不需要通过代码来检测它。
  • 你试过 `instanceof 吗?

标签: php oop inheritance interface extends


【解决方案1】:

您可以使用get_parent_class function:

class Bird{}
class PrettyBird extends Bird{}
class UglyBird extends Bird{}
class Duckling extends UglyBird{}

$bird = new Duckling();
var_dump(get_parent_class($bird));
$bird = new UglyBird();
var_dump(get_parent_class($bird));

输出:

string(8) "UglyBird"
string(4) "Bird"

您可以查看:

if (get_parent_class(new Duckling()) == get_parent_class(new UglyBird())) {
    ....
}

【讨论】:

    【解决方案2】:

    您可以使用instanceof 运算符进行此检查:

    if ($bird instanceof UglyBird) {
        print "MATCH!";
    }
    

    它适用于 UglyBird 的实例和所有继承的类

    查看文档了解详情:http://php.net/manual/en/language.operators.type.php

    【讨论】:

      【解决方案3】:

      可以使用is_subclass_of函数:

      $bird = new Duckling();
      $bird2 = new PrettyBird();
      
      var_dump(is_subclass_of($bird, 'UglyBird')); // True
      var_dump(is_subclass_of($bird2, 'UglyBird')); // False
      

      假设你有一个PrettyBird 的子类:

      class PrettyDuckling extends PrettyBird{}
      

      你想知道 PrettyBird 的孩子是否是 UglyBird 的子类:

      $bird3 = new PrettyDuckling();
      var_dump(is_subclass_of($bird3, 'PrettyBird')); // True
      var_dump(is_subclass_of($bird3, 'UglyBird')); // False
      

      请注意,这也适用于父级的父级:

      var_dump(is_subclass_of($bird, 'Bird')); // True
      var_dump(is_subclass_of($bird2, 'Bird')); // True
      var_dump(is_subclass_of($bird3, 'Bird')); // True
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-14
        • 2014-09-17
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 2021-12-23
        • 2020-12-24
        • 1970-01-01
        相关资源
        最近更新 更多