PHP: ReflectionParameter, isOptional vs isDefaultValueAvailable

В чем разница между двумя. оба они работают точно так же.

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).

Источник: https://github.com/php/php-src/blob/ccf863c8ce7e746948fb060d515960492c41ed27/ext/reflection/php_reflection.c#L2536-L2573