Обзор двух RFC, которые войдут в PHP 7.1:
Всем привет!
Вы слушаете «Пятиминутку 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 и используем по вкусу.
До встречи в следующем выпуске!
Спасибо, было интересно про это узнать.
У меня вот эта конструкция 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