me.neoascetic

Замечательный кусочек PHP-кода

Ковырял сегодня Yii и набрёл на замечательный подход, используемый в случае, когда функция может иметь неограниченное количество аргументов, но с определённым минимальным их количеством. Речь о методе CMap::mergeArray().

<?

public static function mergeArray($a,$b)
{
    $args=func_get_args();
    $res=array_shift($args);
    while(!empty($args))
    {
        $next=array_shift($args);
        foreach($next as $k => $v)
        {
            if(is_integer($k))
                isset($res[$k]) ? $res[]=$v : $res[$k]=$v;
            elseif(is_array($v) && isset($res[$k]) && is_array($res[$k]))
                $res[$k]=self::mergeArray($res[$k],$v);
            else
                $res[$k]=$v;
        }
    }
    return $res;
}

?>

Я сперва и не обратил внимания, что аргументы $a и $b далее в коде не используются: все необходимые переменные получаются через func_get_args, с ними и идёт работа. Для чего же они тогда указаны? Немного поразмыслив, я понял - чтобы ограничить минимальное число аргументов по крайней мере двумя, необходимыми для корректного выполнения функции (при этом необходимо помнить, что PHP позволяет передать функции больше аргументов, чем указано в её сигнатуре, но не меньше).

Альтернативой этому является проверка длины массива $args и бросание исключения, если она недостаточна. Но зачем писать лишний IF, если интерпретатор и сам прекрасно справится с этой задачей?