3

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

class Main
{
}

class Sub extends Main
{
}

class Third
{
}

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

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

4

3 回答 3

10

您可能正在寻找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

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

$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
于 2013-10-31T08:13:14.933 回答
3

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

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

这将输出bool(true).

示例 #3 使用 instanceof 来检查 object 是否不是php.net 上的类的 instanceof 进行比较:

<?php
class MyClass
{
}

$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
于 2013-10-31T08:12:12.277 回答
0

您可以通过实例化第一个参数来坚持所需的功能:

function class_extends($class, $superclass) {
    if ((new $class) instanceof $superclass) {
        return true;
    }
    return false;
}

class_extends('Sub', 'Main'); // boolean true
于 2013-10-31T08:18:42.250 回答