Я изучаю Hack с HHVM и использую дженерики. У меня есть следующий базовый репозиторий:
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 ()
Который возвращает ноль.
Можно ли получить тип T во время выполнения, используя отражение? Если так, как бы я это сделал?
К сожалению, сейчас невозможно получить реальный тип генетики во время выполнения. HHVM имеет семантику стирания типов, что означает, что мы на самом деле не знаем, что это за тип T, когда запускаем код. Однако часто было бы полезно сделать это, и мы рассмотрели, как добавить это, называемое «дженерики». Но это очень сложное, сложное изменение, и поэтому вы не должны ожидать этого в ближайшее время. Сожалею!
Других решений пока нет …