Я видел фрагмент кода на этой неделе (что, к сожалению, я не могу получить), и мне любопытно, как автор начал реализовывать магический метод __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()
, но это не кажется достаточно хорошей причиной для используйте кучу заявлений о делах. Есть ли такой угол, который, кажется, не получается?