Ранее на этой неделе я видел фрагмент кода (который, к сожалению, мне не удалось получить), и мне любопытно, как автор реализовал __ call ()
магический метод. Код выглядел примерно так:
class Sample
{
protected function test()
{
var_dump(func_get_args());
}
public function __call($func, $args)
{
if(!method_exists($this, $func))
{
return null;
}
switch(count($args))
{
case 0:
return $this->$func();
case 1:
return $this->$func($args[0]);
case 2:
return $this->$func($args[0], $args[1]);
case 3:
return $this->$func($args[0], $args[1], $args[2]);
case 4:
return $this->$func($args[0], $args[1], $args[2], $args[3]);
case 5:
return $this->$func($args[0], $args[1], $args[2], $args[3], $args[4]);
default:
return call_user_func_array($this->$func, $args);
}
}
}
$obj = new Sample();
$obj->test("Hello World"); // Would be called via switch label 1
Как видите, автор мог просто использовать call_user_func_array ()
и полностью отказаться от переключателя, так что это заставит меня поверить в то, что это было (надеюсь) какие-то разумные доводы за этим.
Единственная причина, о которой я мог подумать, - это, возможно, некоторые накладные расходы на вызов функции call_user_func_array ()
, но это не кажется достаточно хорошей причиной для использования кучи операторов case. Есть ли здесь угол, который я не понимаю?