【问题标题】:Check for extends [closed]检查扩展[关闭]
【发布时间】:2013-10-31 08:11:08
【问题描述】:

我尝试检测一个被另一个扩展,但它不起作用..有人能指出我正确的方向吗?

class Main
{
}

class Sub extends Main
{
}

class Third
{
}

$check = class_extends('Sub', 'Main'); // should return true
$check = class_extends('Third', 'Main'); // should return false

那么这可能吗?如果可以,怎么做?

【问题讨论】:

标签: php class oop extends


【解决方案1】:

您可能正在寻找is_subclass_of。也适用于实例和字符串类名,假设你有这些类:

class B {}
class C extends B {}
class A {}

然后

var_dump(is_subclass_of('C', 'B')); // true, C is subclass of B
var_dump(is_subclass_of('C', 'A')); // false C is not subclass of A

或者,如果您喜欢细箭头 (->),您也可以使用 reflection

$refC = new ReflectionClass('C');
var_dump($refC->isSubclassOf('B')); // true, C is subclass of B
var_dump($refC->isSubclassOf('A')); // false C is not subclass of A

【讨论】:

    【解决方案2】:

    是的,这是可能的。我想你在哪里找instanceof

    $object = new Sub;
    var_dump($object instanceof Main);
    

    这将输出bool(true)

    Example #3 Using instanceof to check if object is not an instanceof a class on php.net比较:

    <?php
    class MyClass
    {
    }
    
    $a = new MyClass;
    var_dump(!($a instanceof stdClass));
    ?>
    

    【讨论】:

    • 这实际上不是所要求的:对象创建。问题涵盖类名而不是对象,请参阅eval.in/private/b3b6ebcb076f1a - 它也不检查父类(子类),而是任何类型,因此 Main 也将是 Main 的实例,这很可能不是这样的问题将针对。但我可以理解,这些问题都是由这类有问题的问题引起的。
    【解决方案3】:

    你可以通过实例化第一个参数来坚持你想要的功能:

    function class_extends($class, $superclass) {
        if ((new $class) instanceof $superclass) {
            return true;
        }
        return false;
    }
    
    class_extends('Sub', 'Main'); // boolean true
    

    【讨论】:

    • PHP这里不需要创建实例。
    • 老实说,我从来没有使用过 is_subclass_of 函数,所以这让我回答 instanceof 需要类的实例,我想如果我把它作为一个字符串它会返回 false .无论如何,您的解决方案要正确得多:)
    • 我自己没有提出任何解决方案 :),我只是想让您知道,因为我在查看此问答条目时快速阅读了您的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多