查看对象可以说是实例的所有类和接口

时间:2015-06-09 14:01:12

标签: php reflection

是否有一种简单的方法来获取任何对象并获得与true相比将返回instanceof的所有类和接口的完整列表?

1 个答案:

答案 0 :(得分:1)

这可能不是最好的方式(甚至是正确的方式),但在尝试自己找到这个问题的答案时,我想出了这个功能:

function getAllTypes($object) {
    $reflection = new ReflectionObject($object);
    $types = $reflection->getInterfaceNames();
    $types[] = get_class($object);
    while($reflection = $reflection->getParentClass()) {
        $types[] = $reflection->getName();
    }
    return $types;
}

然后我用

测试了它
// Fake classes and interfaces
interface Interface1 {};
interface Interface2 {};
interface Interface3 {};
abstract class Abstract1 implements Interface1 {};
class Class1 extends Abstract1 implements Interface2 {}
class Class2 extends Class1 implements Interface3 {}

// Instantiated object
$testObject = new Class2();

// Test instance of
echo $testObject instanceof Class2 ? '.' : 'X';
echo $testObject instanceof Class1 ? '.' : 'X';
echo $testObject instanceof Abstract1 ? '.' : 'X';
echo $testObject instanceof Interface3 ? '.' : 'X';
echo $testObject instanceof Interface2 ? '.' : 'X';
echo $testObject instanceof Interface1 ? '.' : 'X';
echo PHP_EOL;

// Print all Types
$types = getAllTypes($testObject);
foreach($types as $type) {
    echo $type.PHP_EOL;
}

在控制台中运行会产生以下结果:

$ php test.php
......
Interface2
Interface1
Interface3
Class2
Class1
Abstract1

这是最好的方法吗?我错过了什么吗?

修改

更简单的方法是在不使用反射的情况下执行上述操作:

function getAllTypesEasy($object) {
    return array_merge(
        [get_class($object)],
        class_parents($object),
        class_implements($object)
    );
}

编辑2:

如果不在此处编写所有代码(请参阅链接),进一步的调查显示 执行 需要使用Reflection,如果您想要获取用于构建的所有Traits一个东西。另外,HHVM和PHP对结果的排序略有不同:

http://3v4l.org/vWOmn