ПРИМЕЧАНИЕ. В силу написания этого quesiton я уже понял, что я чрезмерно терпеливо отношусь к использованию новой языковой функции. В гораздо более чистом решении вместо этого использовался шаблон стратегии... тем не менее, мне любопытно, есть ли способ решить эту проблему.
TL; DR: Можете ли вы задуматься об общем вызове в PHP, не прибегая к ручному методу проверки типов всех видов?
В PHP 5.4 у нас есть новый тип: callable. Это кажется очень забавным. Я думал, что воспользуюсь этим через:
<?php
public function setCredentialTreatment(callable $credentialTreatment) {
// Verify $credentialTreatment can be used (ie: accepts 2 params)
... magic here ...
}
?>
До сих пор моя мысль заключалась в том, чтобы сделать серию проверок типов на вызываемых и вывести из того, что использовать класс Reflection *:
<?php
if(is_array($callable)) {
$reflector = new ReflectionMethod($callable[0], $callable[1]);
} elseif(is_string($callable)) {
$reflector = new ReflectionFunction($callable);
} elseif(is_a($callable, 'Closure') || is_callable($callable, '__invoke')) {
$objReflector = new ReflectionObject($callable);
$reflector = $objReflector->getMethod('__invoke');
}
// Array of ReflectionParameters. Yay!
$parameters = $reflector->getParameters();
// Inspect parameters. Throw invalidArgumentException if not valid.
?>
Теперь для меня это слишком сложно. Я пропустил какой-то яркий способ достичь того, что я пытаюсь сделать здесь? Любое понимание будет приветствоваться:)