Pull to refresh

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

Reading time 2 min
Views 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.
Tags:
Hubs:
+2
Comments 18
Comments Comments 18

Articles