是否有一种简单的方法来获取任何对象并获得与true
相比将返回instanceof
的所有类和接口的完整列表?
答案 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对结果的排序略有不同: