Передача массива как аргументов в конструктор
Одна из вещей, из-за которых я жду ПХП версии 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);
А, кроме того, становится более явным и простым. Так что очень радуюсь этому новому синтаксису.
А я бы хотел чего-то такого, опционального списка параметров, в любом порядке
myfunc(login => ’admin’, expiration => 60);
function myfunc($login, $password = null, $expiration = 3600, $isManager = 1) {
echo $login .’ / ’. $password.’ /’.$expiration.’ / ’.$isManager;
}
Комментарий для Паша:
В Пайтоне так можно, а в ПХП, увы, нет. Я видел неоднократные обсуждения этого синтаксиса, но воз и ныне там. Вот последнее на моей памяти: https://wiki.php.net/rfc/named_params
Да хотябы уже «default» сделали бы вместо точго чтобы не указывать явно значение для опционального аргумента который хочешь пропустить в списке аргументов... и то было бы немного легче.
Комментарий для Паша:
Да, такое предложение тоже есть: https://wiki.php.net/rfc/skipparams