Отражения (Reflection API) в php — мощный инструмент для самоанализа кода. Давно не писал ничего интересного, а тут такая интересная мини-задачка — написать маленькую систему бизнес-правил aka BRMSдля обработки сложных форм, причём не просто десять табов который сохраняются в БД, а анализ который приводит к каким-то выводам.
В качестве ядерного решения выступает вызов правил как методов, но тут ещё такая особенность что поскольку форма не одна, и поскольку они очень похожи, то решение — вызывать методы на основе входных данных. Грубо говоря — приходит 40 input-полей, мы анализируем какие из этих полей подходят в качестве аргументов конкретному методу (скажем 3) и вызываем его уже с 3 аргументами (вместо передачи всего массива)
Как я выше написал, анализ проводится с помощью малодокументированными но вполне рабочими отражениями. В итоге примерно такой код..
$oRuleContainer = new cRuleContainer(); //просто класс с методами-правилами
$rContainer = new ReflectionClass('cRuleContainer'); //отражение класса
//где-то тут цикл по вызываемым методам, можно проходится по всем
//но я проходил по методам из базы, поэтому его опускаю.. тут появляется $aRule
$rMethod = $rContainer->getMethod($aRule['method']);
$aArgs = $rMethod->getParameters();
//выбираем только нужные аргументы
if($aArgs){
foreach($aArgs as $refArgument){
$arrPassedArgData[$refArgument->name]=$_POST[$refArgument->name];
}
}
if(call_user_func_array(array($oRuleContainer,$aRule['method']),$arrPassedArgData)){
//правило сработало
}
Кстати, я прекрасно понимаю что можно вызывать правила без ничего, читая всё из POST, но тут решение эстетическое и повторно используемое.