В чем разница между двумя. оба они работают точно так же.
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 не является необязательным и не имеет значения по умолчанию.
Функция 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
. isDefaultValueAvailable
для функции (PHP).