繁体   English   中英

如何测试类实例是否属于同一级别的父类之一?

[英]How can I test if a class instance belongs to one of the parent classes that are on the same level?

说我有这个:

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

我这样做:

$bird = new Duckling();

要么

$bird = new UglyBird();

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

怎么样?

目前我可以通过

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

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

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

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

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

检查文档以获取详细信息: http : //php.net/manual/zh/language.operators.type.php

您可以使用函数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

您可以使用get_parent_class函数

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())) {
    ....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM