编程语言
首页 > 编程语言> > Php使用Hack中的反射获取通用类型

Php使用Hack中的反射获取通用类型

作者:互联网

我正在使用HHVM探索Hack,并且正在使用泛型.我有以下基本存储库:

class BaseRepository<T>{
     public function __construct(T $model){
        ...
     }
}

然后我有子类UserRepository像这样:

class UserRepository extends BaseRepository<User> {

}

我想要做的是使用反射在运行时获取T的类型.

我尝试了以下方法:

$reflectionClass = new ReflectionClass('UserRepository');
$parameters = $reflectionClass->getConstructor()->getParameters();
var_dump($parameters);

输出以下内容:

array(1) {
  [0]=>
  object(ReflectionParameter)#854 (2) {
   ["info"]=>
   array(9) {
     ["index"]=>
      int(0)
      ["name"]=>
      string(5) "model"
      ["type"]=>
      string(0) ""
      ["type_hint"]=>
      string(1) "T"
      ["function"]=>
      string(11) "__construct"
      ["class"]=>
      string(36) "BaseRepository"
      ["nullable"]=>
      bool(true)
      ["attributes"]=>
      array(0) {
      }
      ["is_optional"]=>
      bool(false)
    }
    ["name"]=>
    string(5) "model"
  }

}

然后,我遍历参数并调用:
   $parameter-> getClass()

返回空值.

是否可以使用反射在运行时获取T的类型?如果是这样,我该怎么做?

解决方法:

不幸的是,现在无法在运行时获取实际的遗传类型. HHVM具有针对它们的类​​型擦除语义,这意味着我们实际上在运行代码时不知道T的特定类型是什么.但是,能够做到这一点通常会很有用,并且我们已经考虑了如何添加它,称为“ reifiedgenerics”.但这是一个非常复杂的,涉及变更的事情,因此您不应该期望它很快出现.抱歉!

标签:hacklang,reflection,generics,hhvm,php
来源: https://codeday.me/bug/20191121/2049592.html