PHP : ReflectionParameter, isOptional vs isDefaultValueAvail



两者的区别是什么?两者的工作方式完全相同。

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

相关内容

  • 没有找到相关文章

最新更新