Передача массива как аргументов в конструктор

Одна из вещей, из-за которых я жду ПХП версии 5.6 — это развёртывание массива в параметры. В принципе, для этого есть функция call_user_func_array, но новый синтаксис куда приятнее:
$result = call_user_func_array('myfunc', $args); // старый синтаксис
$result = myfunc(...$args); // PHP 5.6+
Но помимо приятности, он решает две проблемы.

Во-первых, второй случай более внятен для среды разработки — тут явный вызов функции, который легко находится парсером. Если вы захотите посмотреть где используется какая-то фунция, то это место легко находится. В первом же случае для этой конструкции (и для её брата call_user_func) приходится делать исключение и считать её первый аргумент именем функции.

Во-вторых, сейчас в ПХП нет нормального способа сделать то же с конструктором. Например, если в вашем фреймворке есть класс, возвращающий сервисы (в терминах «Симфони 2»), то в нём придётся делать либо switch/case (для скорости), либо обращаться через рефлекшн:
switch (count($params)) {
    case 0:
        $instance = new $class();
        break;

    case 1:
        $instance = new $class($params[0]);
        break;

    case 2:
        $instance = new $class($params[0], $params[1]);
        break;

    // и так далее…

    default:
        $refClass = new \ReflectionClass($class);
        $instance = $refClass->newInstanceArgs($params);
        break;
}
В новом же синтаксисе код невероятно упрощается:
$instance = new $class(...$params);
А, кроме того, становится более явным и простым. Так что очень радуюсь этому новому синтаксису.
12 августа 2014 12:56

Паша (инкогнито)
13 августа 2014, 00:11

А я бы хотел чего-то такого, опционального списка параметров, в любом порядке

myfunc(login => 'admin', expiration => 60);

function myfunc($login, $password = null, $expiration = 3600, $isManager = 1) {
    echo $login .' / '. $password.' /'.$expiration.' / '.$isManager;
}

Евгений Степанищев (bolknote.ru)
13 августа 2014, 06:09, ответ предназначен Паше

В Пайтоне так можно, а в ПХП, увы, нет. Я видел неоднократные обсуждения этого синтаксиса, но воз и ныне там. Вот последнее на моей памяти: https://wiki.php.net/rfc/named_params

Паша (инкогнито)
21 августа 2014, 09:19

Да хотябы уже "default" сделали бы вместо точго чтобы не указывать явно значение для опционального аргумента который хочешь пропустить в списке аргументов... и то было бы немного легче.

Евгений Степанищев (bolknote.ru)
22 августа 2014, 06:58, ответ предназначен Паше

Да, такое предложение тоже есть: https://wiki.php.net/rfc/skipparams

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)