Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

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

Одна из вещей, из-за которых я жду ПХП версии 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);

А, кроме того, становится более явным и простым. Так что очень радуюсь этому новому синтаксису.

4 комментария
Паша 2014

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

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

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

Евгений Степанищев (bolknote.ru) 2014

Комментарий для Паша:

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

Паша 2014

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

Евгений Степанищев (bolknote.ru) 2014

Комментарий для Паша:

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