Während der Bastelei am DI-Container bin ich über die beiden Methoden ReflectionParameter::isOptional() und ReflectionParameter::isDefaultValueAvailable() gestoßen. Der kleine, undokumentierte und feine Unterschied ist folgender:
Ein formaler Parameter einer Methode/Funktion ist immer optional, wenn er einen Initialwert zugewiesen bekommt (Fachausdruck “Polymorphie für Arme”). Nun kann es sein, dass eine Methode zwar optional ist, man den DefaultValue aber nicht abfragen darf. ReflectionParameter::getDefaulValue() würde in diesem Falle eine Exception werfen. Dies kann bspw. bei internen Funktionen/Methoden (auch der Default-Constructor ist eine “interne” Methode) der Fall sein. Also Vorsicht bei Verwendung von ReflectionParameter::isOptional(), besser nochmal via ReflectionParameter::isDefaultValueAvailable() prüfen, ob man an den Parameter wirklich dran darf, bevor man ihn sich via ReflectionParameter::getDefaultValue() holt.