我正在用这样的默认参数测试php的反射......
class Test{
public function testMethod($class,$methodName){
// the returned values
$data = array();
// get the method of the class passed by params
$funcHandler = new ReflectionMethod($class,$methodName);
// iterates through the parameters to catch de default values
foreach ($funcHandler->getParameters() as $param){
// instance the params to get the properties for that method
$paramDetail = new ReflectionParameter(array($class, $method),$param->name);
// check if that param is or has a default value attached like (public function method($a,$b,$c = false, $d = null)
$data[$param->name] = ($paramDetail->isDefaultValueAvailable) ? funcHandler->getDefaultValue : '';
return $data;
}
}
//let's test the reflection with the method params...
class Foo{
public function method1($a,$b,$c = false, $d = null, $e = 'hello'){
// instance of the Test Class
$obj = new Test();
// calling the test method with this class and method names
print_r($obj->testMethod(__CLASS__,__FUNCTION__));
}
}
问题是该行“new ReflectionParameter(array($ class,$ method),$ param-> name);” 执行“$ data [$ param-> name] =($ paramDetail-> isDefaultValueAvailable)时?” 说没有isDefaultValueAvailable也不是可选的。
任何想法如何从类方法中提取可选参数? 它似乎与函数一起工作。
答案 0 :(得分:3)
ReflectionParameter类有一个isOptional()方法,它会告诉你参数是否是可选的(如果它有默认值,它只能是可选的),如果它是可选的,您可以调用getDefaultValue()来提取默认值。
这是你的代码修补使用它们:
<?php
class Test {
public function testMethod($class,$methodName){
// the returned values
$data = array();
// get the method of the class passed by params
$funcHandler = new ReflectionMethod($class,$methodName);
// iterates through the parameters to catch de default values
foreach ($funcHandler->getParameters() as $param){
// the new ReflectionParameter ... not needed, getParameters() already give you ReflectionParameter instances
// check if that param (a ReflectionParameter instance) has a default value attached like (public function method($a,$b,$c = false, $d = null)
$data[$param->name] = ($param->isOptional()) ? $param->getDefaultValue() : '';
}
return $data;
}
}
//let's test the reflection with the method params...
class Foo{
public function method1($a,$b,$c = false, $d = null, $e = 'hello'){
// instance of the Test Class
$obj = new Test();
// calling the test method with this class and method names
var_dump($obj->testMethod(__CLASS__,__FUNCTION__));
}
}
$f = new Foo;
$f->method1('a', 'b');
输出:
array(5) {
["a"]=>
string(0) ""
["b"]=>
string(0) ""
["c"]=>
bool(false)
["d"]=>
NULL
["e"]=>
string(5) "hello"
}
答案 1 :(得分:0)
isOptional和isDefaultValueAvailable都是方法而不是属性。