两者的区别是什么?两者的工作方式完全相同。
public static function getArgsArray($reflectionMethod,$argArray){
$arr = array();
foreach($reflectionMethod->getParameters() as $key => $val){
$arr[$val->getName()] = isset($argArray[$val->getName()]) ?
$argArray[$val->getName()] : (isset($_REQUEST[$val->getName()])
? $_REQUEST[$val->getName()] : ($val->*isDefaultValueAvailable()* ? $val->getDefaultValue() : NULL));
}
return $arr;
}
问得好。考虑以下示例
function foo($foo = 'foo', $bar) {}
对于$foo
参数,isDefaultValueAvailable()
可以理解地返回true
,但是isOptional()
将返回false
,因为下一个参数($bar
)没有默认值,因此不是可选的。为了支持非可选的$bar
参数,$foo
本身必须是不可选的。
希望这是有意义的;)
我注意到不同PHP版本的行为是不同的。5.5返回上述值,而5.4说参数1既不是可选的,也没有默认值。
- PHP 5.4 - https://eval.in/154641
- PHP 5.5 - https://eval.in/154642
isDefaultValueAvailable
函数只能作用于用户定义函数,不能作用于系统函数(PHP核心)
例如:
class Foo
{
public function foo($var = null)
{
}
}
// Get the "var" argument in method Foo::foo
$refParameter = (new ReflectionClass('Foo'))->getMethod('foo')->getParameters()[0];
print "User function Foo::foo:nn";
print 'Optional: ' . ($refParameter->isOptional() ? 'true' : 'false') . "n";
print 'Default available: ' . ($refParameter->isDefaultValueAvailable() ? 'true' : 'false') . "n";
if ($refParameter->isDefaultValueAvailable()) {
print 'Default value: ' . var_export($refParameter->getDefaultValue(), 1);
}
print "nn";
print "System function substrnn";
// Get the "length" parameter from function substr
$refParameter = (new ReflectionFunction('substr'))->getParameters()[2];
print 'Optional: ' . ($refParameter->isOptional() ? 'true' : 'false') . "n";
print 'Default available: ' . ($refParameter->isDefaultValueAvailable() ? 'true' : 'false') . "n";
if ($refParameter->isDefaultValueAvailable()) {
print 'Default value: ' . var_export($refParameter->getDefaultValue(), 1);
}
print "nn";
并且,这段代码显示:您只能从用户定义的函数中获取默认值,而不能从系统函数(substr
为例)中获取默认值。但是isOptional
方法在用户定义函数和系统函数中返回true
。
结论:
- 如果您想检查参数是否可选,必须使用
isOptional
方法。 - 只能从自定义函数中获取缺省值。 不能在系统(PHP)定义的函数中使用
isDefaultValueAvailable
方法。来源:https://github.com/php/php-src/blob/ccf863c8ce7e746948fb060d515960492c41ed27/ext/reflection/php_reflection.c L2536-L2573