Pull to refresh

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

Reading time2 min
Views6.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:
Total votes 24: ↑13 and ↓11+2
Comments18

Articles