Php Hack中使用反射获取泛型类型

标签 php generics reflection hhvm hacklang

我正在使用 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"
  }

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

返回 null。

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

最佳答案

不幸的是,现在不可能在运行时获得实际的遗传学类型。 HHVM 对它们具有类型删除语义,这意味着我们在运行代码时实际上并不知道 T 的具体类型是什么。然而,能够做到这一点通常很有用,我们已经考虑了如何添加它,称为“具体化泛型”。但这是一个非常复杂、涉及的变化,所以你不应该期望很快就会发生。对不起!

关于Php Hack中使用反射获取泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406123/

相关文章:

php - sql中如何获取指定日期的数据

java - Java 泛型的乐趣

ios - 如何在 Swift 中迭代 CustomCollection 泛型

.net - 什么是动态方法,DynamicMethod 与 MethodBuilder 有何不同?

reflection - 通过反射在 dart 中通过名称作为字符串获取类的公共(public)静态字段/属性的值

javascript - 如何在 URL 中不带 # 的情况下转到不同网站页面中的特定 div

php - 与 PHP 文件和本地 javascript 文件的 JSON 跨域通信

php - 如何使用php创建ipa文件

java - 泛型无法做出正确的推论

c# - 使用反射进行深度扫描 - 有更好的方法吗?