使用 ReflectionProperty 时如何获取 class 属性 的联合类型?

How to get union types of a class property when using ReflectionProperty?

我正在尝试使用 ReflectionProperty 在 class 上获取 属性 的联合类型。但是运气不好。

class Document 
{
   // Standard type
   public string $companyTitleStandard;

   // Union types
   public DocumentFieldCompanyTitle|string $companyTitleUnion;
}

标准类型工作正常。然而,联合类型,我无法为爱和金钱弄清楚如何实施。

$rp = new ReflectionProperty(Document::class, 'companyTitleStandard');
echo $rp->getType()->getName(); // string

$rp = new ReflectionProperty(Document::class, 'companyTitleUnion');
echo $rp->getTypes(); // Exception: undefined method ReflectionProperty::getTypes()    
echo $rp->getType()->getTypes(); // Exception: undefined method ReflectionNamedType::getTypes()

我最终正在寻找这样的东西来玩:

['DocumentFieldCompanyTitle', 'string']

有什么想法吗?提前致谢

关于联合类型,第一个

$rp->getType()

将return一个ReflectionUnionType
要获取联合中各个类型的名称,您需要遍历

$rp->getType()->getTypes()

所以只输出类型:

foreach ($rp->getType()->getTypes() as $type) {
    echo $type->getName() . PHP_EOL;
}

如果您更愿意在普通数组中获取联合的类型,您可以这样做:

$unionTypes = array_map(function($type) { 
    return $type->getName();
}, $rp->getType()->getTypes());

或简称 one-liner:

$unionTypes = array_map(fn($type) => $type->getName(), $rp->getType()->getTypes());

这是一个演示:https://3v4l.org/SlbXX#v8.0.19