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

Php 如何通过反射获取构造函数参数的类型?,php,reflection,Php,Reflection,我在构造函数参数列表中使用类型提示,如下所示: public function __construct(FooRepository $repository) 有没有一种方法可以使用PHP反射API来获取提示类型?换句话说,我需要一个反射函数,我可以调用该函数以某种方式获取字符串“foosrepository”。我尝试通过反射获取构造函数,然后获取参数(如果是构造函数的话),但是我没有看到任何东西可以提供提示类型的字符串。您是在尝试获取提示类型还是实际类型?我不明白您为什么想要得到暗示类型,因为

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

public function __construct(FooRepository $repository)

有没有一种方法可以使用PHP反射API来获取提示类型?换句话说,我需要一个反射函数,我可以调用该函数以某种方式获取字符串“foosrepository”。我尝试通过反射获取构造函数,然后获取参数(如果是构造函数的话),但是我没有看到任何东西可以提供提示类型的字符串。

您是在尝试获取提示类型还是实际类型?我不明白您为什么想要得到暗示类型,因为您知道它是“FooRepository”,否则PHP会引发错误

您可以通过获取实际类型,还可以确定对象是否继承自具有的给定类。

试试这个

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>';
}
class-Foo{
公共函数构造(Bar$test){
}
}
分类栏{
公共函数构造(){
}
}
$reflection=newreflectionclass('Foo');
$params=$reflection->getConstructor()->getParameters();
foreach($params作为$param){
echo$param->getClass()->name.“
”; }
查看PHP5.4

他们计划在今年推出PHP5.4,它将拥有参数->getHint()的反射方法(当前在开发版本中)

但是,在5.4正式发布之前,我将使用

例如,您可以在@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
}

+1太棒了。我以前做过很长一段时间。他们真的应该有一天记录反射。这只适用于类,任何其他提示都会失败,出现“类***不存在”异常。@AlixAxel实际上只允许类和数组进行类型提示。您应该检查ReflectionParameter::isArray()first@hek2mgl对于获取类型,更好的方法是
$param->getType()->getName()
。这不需要检索类,也允许使用标量类型。我可以看到,在MVC框架中,动态加载模型类的文件,并将post/get数据动态映射到对象时,这一点会很方便。@Twisted类型和提示类型之间存在差异。重读我的答案,你完全没有抓住重点。@meager请允许我重新措辞。我断言,在许多情况下,您可能想知道暗示类型。例如,您可以在ORM对象类中轻松创建一些setPropX(myType$value)方法。然后,您的ORM实现可以反射以获得提示,这样您就知道要转换到什么类型了。+1,但PHP 5.4.7仍然没有任何迹象显示
ReflectionParameter::getHint()
:(.@AlixAxel,很遗憾,由于语言开发人员完全缺乏远见/关注,我在过去几年中已经离开了PHP(哦,好吧。只是出于好奇,你选择了什么来取代它?@AlixAxel Java。比C#更喜欢它。语言有一个很好的时间轴。如果PHP6会发生,这并不理想。最终,这被写入了Laravel的IoC容器-bravo@taylorotwell!
value is MyType
value2 is array