Я использую тип, намекающий на список параметров конструктора следующим образом:
public function __construct(FooRepository $repository)
Есть ли способ использовать PHP Reflection API для получения намеченного типа? Другими словами, я хочу функцию отражения, которую я могу вызвать, чтобы как-то вернуть строку «FooRepository». Я попытался получить конструктор через отражение, а затем получить параметры, если конструктор, но я не вижу ничего, что даст мне строку намеченного типа.
Изменить: я исправил себя. Попробуйте это.
class Foo { public function __construct(Bar $test) { } } class Bar { public function __construct() { } } $reflection = new ReflectionClass('Foo'); $params = $reflection->getConstructor()->getParameters(); foreach ($params AS $param) { echo $param->getClass()->name . '<br>'; }
Проверьте PHP 5.4
Они планируют выпустить PHP 5.4 в этом году, который будет иметь метод отражения (текущий в конструкциях dev) параметра-> getHint ()
Тем не менее, пока 5.4 не переходит в GA, я использую ReflectionClass :: getDocComment ()
Например, вы можете указать его в @param.
// Adapted from meager's example class Bar {} class Foo { /** * @param MyType $value * @param array $value2 */ function __construct(Bar $value, array $value2) { } } // Regex function getHint( $docComment, $varName ) { $matches = array(); $count = preg_match_all('/@param[\t\s]*(?P<type>[^\t\s]*)[\t\s]*\$(?P<name>[^\t\s]*)/sim', $docComment, $matches); if( $count>0 ) { foreach( $matches['name'] as $n=>$name ) { if( $name == $varName ) { return $matches['type'][$n]; } } } return null; } $reflection = new ReflectionClass('Foo'); $constructor= $reflection->getConstructor(); $docComment = $constructor->getDocComment(); $params = $constructor->getParameters(); foreach ($params AS $param) { $name = $param->getName(); echo $name ." is "; //echo $param->getHint()."\n"; // in PHP 5.4 echo getHint($docComment, $name)."\n"; // work around }
Вывод:
value is MyType value2 is array
Вы пытаетесь получить намеченный тип или фактический тип? Я не понимаю, почему вы можете захотеть получить намеченный тип, поскольку вы знаете, что это «FooRepository» или PHP вызвали бы ошибку.
Вы можете получить фактический тип через get_class
и вы также можете узнать, наследует ли объект от данного класса с ReflectionClass::isSubclassOf
.