Выпуск №21 — list()

Обзор двух RFC, которые войдут в PHP 7.1:

  1. Allow specifying keys in list()
  2. Square bracket syntax for array destructuring assignment

Всем привет!
Вы слушаете «Пятиминутку PHP», выпуск номер 21 — подкаст о новостях из мира PHP, интересных постах в блогах и современных подходах к разработке.

В 18 выпуске подкаста я рассказывал о процедуре RFC (Request for Comments), через которую проходит обсуждение и добавление новых фич в язык PHP. На этот раз я хочу подробнее остановиться на двух RFC, которые уже приняты и войдут в PHP 7.1. Оба являются небольшим синтаксическим сахаром, который лично мне очень нравится.

Первый RFC называется: «Allow specifying keys in list()».

Напомню, что со времён версии 4.0 в PHP существует конструкция list, которая позволяет присвоить несколько значений из пронумерованного массива нескольким переменным в одну строку. Это удобный синтаксис, если, например, вы читаете результаты запроса к базе или хотите вернуть из функции несколько значений.

Как это выглядит: вы используете оператор присваивания и пишете list($a, $b) = $arr, где справа от оператора присваивания должен находиться массив. Соответственно, переменной $a будет присвоено значение нулевого элемента массива, а переменной $b значение элемента массива с индексом 1. Один из известных трюков – это возможность поменять местами значения двух переменных в одну строку написав list($a, $b) = [$b, $a].

Внутри конструкции list можно указать любое количество переменных, и они примут значения соответствующих по порядку элементов массива, стоящего справа от оператора присваивания.

Не все знают, но конструкции list можно вкладывать друг в друга, тем самым обращаясь к вложенным массивам. Ещё одна хитрость в том, что некоторые элементы из массивов можно пропустить, просто написав внутри list две запятые подряд.

Кстати говоря, в правой части присваивания не обязательно должен быть PHP тип array, это может быть любой тип реализующий интерфейс ArrayAccess.

Всё что я рассказал только что – это не что-то новое, это конструкция list, которая существует в PHP начиная с версии 4.0. А что нового предлагает нам «RFC: Allow specifying keys in list()», так это возможность разбирать по переменным не только пронумерованные массивы, но и ассоциативные, указывая требуемые ключи в конструкции list.

Например, у нас есть ассоциативный массив, отображающий какую-то строку из таблицы из базы данных. Я хочу вынуть значения трёх элементов из этого массива в отдельные переменные, значения элементов с ключами ‘id’, ‘name’ и ‘age’. Можно сделать три операции присваивания. А можно более кратко: написать list('id' => $id, 'name' => $name, 'age' => $age) = $arr. Ключами внутри конструкции list могут быть не только строковые литералы, но и выражения, например, константы или переменные содержащие значение ключа.

Второй RFC, который я хочу упомянуть в этом выпуске подкаста, называется «Square bracket syntax for array destructuring assignment» — новый синтаксис деструктуризации массивов. Destructuring (или «деструктуризация») – это когда мы разбираем сложную структуру данных по кусочкам, по отдельным переменным. Конструкция list по сути и есть способ деструктуризации массивов. Данный RFC предлагает нам больше не писать слово list, а использовать квадратные скобки в левой части оператора присваивания.

Это изменение сродни тому, когда с выходом PHP 5.4 мы смогли создавать массивы не используя конструкцию array, а через квадратные скобки. Теперь же с квадратными скобками по обе стороны присваивания, синтаксис становится консистентным и симметричным, и это мне нравится.

Более того, этот RFC учитывает предыдущий и мы сможем деструктурировать и ассоциативные массивы, указывая нужные ключи в левой части присваивания.

Синтаксис квадратных скобок, как и конструкцию list, можно будет вкладывать друг в друга для доступа ко вложенным массивам. Единственное, чего нельзя: мешать новый синтаксис со старой конструкцией list при вложении.

Примечательно, что все 41 человек голосовавших за этот RFC единодушно его одобрили.

Ждём в PHP 7.1 и используем по вкусу.

До встречи в следующем выпуске!

  • Lebnik

    Спасибо, было интересно про это узнать.

  • Евгений

    У меня вот эта конструкция list(‘id’ => $id, ‘name’ => $name) = $arr; бросает ексепшин
    syntax error, unexpected »id» (T_CONSTANT_ENCAPSED_STRING), expecting ‘,’ or ‘)’

    • Этот синтаксис работает в PHP начиная с версии 7.1.
      В более старых версиях, в том числе в 7.0.x ключи внутри list не работают. Подозреваю, что у вас версия PHP < 7.1