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需要非常小心地区分那些嵌套的三元语句。除了麻烦你有没有失败的例子?三元语句?它们很难读懂,逻辑过程也不总是清晰的。请看这里的说明~谢谢,明白你的意思了,我只在用户定义的功能中使用它