Как получить параметр конструктора через отражение?
Я использую тип, намекающий на список параметров конструктора, например:
public function __construct(FooRepository $repository)
Есть ли способ использовать PHP Reflection API для получения намеченного типа? Другими словами, я хочу функцию отражения, которую я могу вызвать, чтобы как-то вернуть строку "FooRepository". Я попытался получить конструктор через отражение, а затем получить параметры, если конструктор, но я не вижу ничего, что даст мне строку намеченного типа.
Ответы
Ответ 1
Попробуйте это.
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>';
}
Ответ 2
Ознакомьтесь с PHP 5.4
В этом году они планируют выйти из PHP 5.4, который будет иметь метод отражения (текущий в конструкциях dev) parameter- > getHint()
Однако, пока 5.4 не переходит в GA, я использую ReflectionClass:: getDocComment()
Например, вы можете указать его в @param.
// Adapted from meager 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
Ответ 3
Вы пытаетесь получить намеченный тип или фактический тип? Я не понимаю, почему вы можете захотеть получить намеченный тип, так как вы знаете, что это "FooRepository" или PHP вызвали бы ошибку.
Вы можете получить фактический тип через get_class
, и вы также можете узнать, наследует ли объект от данного класса с ReflectionClass::isSubclassOf
.