如何通过反射获取构造函数参数的类型?

时间:2010-11-24 00:09:50

标签: php reflection

我在构造函数参数列表中使用类型提示,如下所示:

public function __construct(FooRepository $repository)

有没有办法使用PHP Reflection API获取提示类型?换句话说,我想要一个反射函数,我可以调用它以某种方式返回字符串“FooRepository”。我试过通过反射获取构造函数,然后获取参数,如果构造函数,但我没有看到任何会给我提示类型的字符串。

3 个答案:

答案 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的给定类。