Как стать автором
Обновить

Передача аргументов функции по имени в PHP

Время на прочтение2 мин
Количество просмотров6.6K
При рефакторинге кода возникла одна небольшая идея относительно вызова методов. Иногда возникает потребность передать функции аргумент по имени. Например тогда, когда невозможно (или неудобно) передать список в нужном порядке. Такими случаями могут быть вызовы динамических блоков из шаблонизаторов: в шаблоне у нас {{mymodule action=foo second=124322 fourth='catalog' first='name' third='foo'}} и в коде есть следуйщая синатура функции — function foo($first, $second, $third, $fourth). подобный подход используеться в системе Magento для вызова блоков из лей-аутов; или нужно передать методу даные на основе фильтра в каком-нибуть асоциативном масиве. В PHP4 возможным решением было помещение всего списка аргументов в масив. В PHP версии 5 есть же Reflection API, с помощью которого возможно проделать подобное. Perl, Python (, ...) могут, так почему ж ето должно быть невозможно в PHP?:)

UPD: код на pastebin затерся, вот метод-хелпер для етого (вызов вида $object->__named('methodNameHere', array('arg3' => 'three', 'arg1' => 'one')))
  /**
   * Pass method arguments by name
   *
   * @param string $method
   * @param array $args
   * @return mixed
   */
  public function __named($method, array $args = array())
  {
    $reflection = new ReflectionMethod($this, $method);

    $pass = array();
    foreach($reflection->getParameters() as $param)
    {
      /* @var $param ReflectionParameter */
      if(isset($args[$param->getName()]))
      {
        $pass[] = $args[$param->getName()];
      }
      else
      {
        $pass[] = $param->getDefaultValue();
      }
    }

    return $reflection->invokeArgs($this, $pass);
  }


* This source code was highlighted with Source Code Highlighter.
Теги:
Хабы:
+2
Комментарии18

Публикации

Изменить настройки темы

Истории

Работа

PHP программист
155 вакансий

Ближайшие события