我在构造函数参数列表中使用类型提示,如下所示:
public function __construct(FooRepository $repository)
有没有办法使用PHP Reflection API获取提示类型?换句话说,我想要一个反射函数,我可以调用它以某种方式返回字符串“FooRepository”。我试过通过反射获取构造函数,然后获取参数,如果构造函数,但我没有看到任何会给我提示类型的字符串。
答案 0 :(得分:33)
试试这个。
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>';
}
答案 1 :(得分:0)
查看PHP 5.4
他们计划今年推出PHP 5.4,它将采用参数 - &gt; 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
答案 2 :(得分:-1)
您是尝试获取提示类型还是实际类型?我不明白为什么你想得到提示类型,因为你知道它是'FooRepository'或者PHP会引发错误。
您可以通过get_class
获取实际类型,还可以查看对象是否继承自ReflectionClass::isSubclassOf
的给定类。