PHP:ReflectionParameter、等参变量与isDefaultValueAvailable

PHP:ReflectionParameter、等参变量与isDefaultValueAvailable,php,reflection,Php,Reflection,两者的区别是什么。这两种方法的工作原理完全相同 public static function getArgsArray($reflectionMethod,$argArray){ $arr = array(); foreach($reflectionMethod->getParameters() as $key => $val){ $arr[$val->getName()] = isset($argArray[$val->getName()

两者的区别是什么。这两种方法的工作原理完全相同

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-
  • PHP 5.5-

函数
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:\n\n";

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 "\n\n";

print "System function substr\n\n";

// 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 "\n\n";
并且,该代码显示:您只能从用户定义的函数中获取默认值,而不能从系统函数中获取默认值(
substr
)。但是方法
isOptional
在用户定义函数和系统函数中返回了
true

结论:

  • 如果要检查参数是否可选,则必须使用
    isOptional
    方法
  • 只能从用户定义的函数中获取默认值
  • 您不能在系统(PHP)定义的函数上使用方法
    isDefaultValueAvailable

来源:

你的意思是,在你的例子中,$foo='foo'如果我像这样称呼它foo(null,'hello'),而不是foo('helllo')@LNT,那就把
$foo
设置为
null
。编写函数是一种愚蠢的方法,但并非不可能,因此反射util需要非常小心地区分那些嵌套的三元语句。除了麻烦你有没有失败的例子?三元语句?它们很难读懂,逻辑过程也不总是清晰的。请看这里的说明~谢谢,明白你的意思了,我只在用户定义的功能中使用它