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()

返回null。

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

不幸的是,现在不可能在运行时获得实际类型的遗传学。HHVM为它们提供了类型擦除语义,这意味着当我们运行代码时,我们实际上不知道t的具体类型是什么。然而,能够做到这一点通常是有用的,我们已经考虑了如何添加这一点,称为"具体化泛型"。但这是一个非常复杂、复杂的变化,所以你不应该期待它很快到来。很抱歉

相关内容

  • 没有找到相关文章

最新更新