注: この質問を書いたおかげで、私は新しい言語機能の使用に過度に熱中していたことに気づきました。はるかにクリーンな解決策は、代わりに戦略パターンを使用することでした... それでも、この問題を解決する適切な方法があるかどうか知りたいです。
TL;DR: すべての種類の callable を手動で型チェックすることなく、PHP のジェネリック Callable について考えることができますか?
PHP 5.4 では、新しいタイプヒント callable があります。これはとても楽しそうです。これを次のように活用しようと考えました。
<?php
public function setCredentialTreatment(callable $credentialTreatment) {
// Verify $credentialTreatment can be used (ie: accepts 2 params)
... magic here ...
}
?>
これまでの私の考えは、callable で一連の型チェックを行い、それからどの 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.
?>
さて、私には、これは非常に複雑に感じます。ここでやろうとしていることを達成するための何らかの近道がありませんか? どんな洞察も歓迎されます:)