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