2014-10-16 74 views
1

我正在HHVM中探索Hack,而且我正在使用泛型。我有以下的基本信息庫:Php在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的類型?如果是的話,我會怎麼做?

回答

2

不幸的是,現在不可能在運行時獲得實際的遺傳學類型。 HHVM爲它們提供了類型擦除語義,這意味着我們實際上並不知道在運行代碼時特定類型的T是什麼。然而,能夠做到這一點通常是有用的,而且我們已經考慮過如何添加這個,稱爲「物化泛化」。但它是一個非常複雜,涉及到的變化,所以你不應該期待它很快。抱歉!

+0

感謝您的回答。我有一個後續。一般來說,黑客泛型似乎不起作用。請看這個要點:https://gist.github.com/leftyhitchens/03bf07f5566125c9ce39我錯過了什麼嗎?或者這是一個已知的錯誤? – Thomas 2014-10-16 15:51:38

+0

這實際上會是一個語法錯誤 - 確保你正在運行強制執行很多語言的類型檢查器。 (HHVM的最新版本也會告訴你是否不這樣做。)信息:http://docs.hhvm.com/manual/en/install.hack.bootstrapping.php – 2014-10-16 16:28:47