2015-06-27 5 views
6

Я нашел это странное заявление переключателя в Laravel 5 core:Разве это не означает, что это заявление?

switch (count($args)) { 
    case 0: 
     return $instance->$method(); 
    case 1: 
     return $instance->$method($args[0]); 
    case 2: 
     return $instance->$method($args[0], $args[1]); 
    case 3: 
     return $instance->$method($args[0], $args[1], $args[2]); 
    case 4: 
     return $instance->$method($args[0], $args[1], $args[2], $args[3]); 
    default: 
     return call_user_func_array([$instance, $method], $args); 

Есть ли причина, почему они, возможно, решили построить такую ​​вещь, вместо того, чтобы просто использовать это?

return call_user_func_array([$instance, $method], $args); 

Любые выгоды?

+0

Возможно, это было переведено с языка, который имеет функцию перегрузки. Или они обнаружили, что в наиболее распространенных случаях было небольшое повышение производительности (предположительно, где $ args было 4 или меньше). –

+0

Нет, это не ерунда .. язык, такой как C++, поддерживает эту и вызванную перегрузку функции, ** Полиморфизм ** может быть достигнут путем перегрузки –

+2

@ NullPoiиteya Но PHP не имеет перегрузки функций. –

ответ

6

IMHO программист избегал call_user_func_array() за разумное количество типичных звонков $instance->method(). Конечно, быстрее использовать метод напрямую, вместо использования call_user_func_array(). Код был написан с любовью :)

+1

Возможно, Laravel в ближайшее время потребует PHP 5.6+, тогда они смогут сделать эту маленькую причудливую вещь: 'return $ instance-> method (... $ args);'. –

+3

@RoboRobok Я полагаю, что прямое влияние этого кода на [этот комментарий] (http://php.net/manual/en/function.call-user-func-array.php#100794) на функцию в PHP документация. Github показывает, что код был первоначально зафиксирован в январе 2010 года, поэтому автор, скорее всего, беспокоился о производительности в PHP 5.3. – patricus

+0

@patricus Хорошая добыча! Интересно, почему все комментарии там проголосовали. – hek2mgl

0

Возможно, что существуют функции с до 4 аргументами, которые, как ожидается, передаются по значению, а не по ссылке. Обратите внимание на примечание к документации по функциям относительно использования PHP PHP 5.4. call_user_func_array docs

Смежные вопросы