PHP-Дайджест № 185 (20 июля – 3 августа 2020)
Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 Alpha 3, PhpStorm 2020.2, новый оператор ?->
, снова обсуждение синтаксиса атрибутов и другие новости PHP Internals, обзор системы типов в PHP, порция полезных инструментов, видео, стримы и многое другое.
Приятного чтения!
Новости и релизы
- PHP 8.0.0 Alpha 3 — Последний альфа-релиз из запланированных. Первая бета ожидается 6 августа.
- Релиз PhpStorm 2020.2 — Объединенные типы PHP 8, новый движок потока управления, пул-реквесты GitHub, OpenAPI. По ссылке подробный разбор этих и других изменений.
PHP Internals
- [RFC] Shorter Attribute Syntax Change — История с синтаксисом атрибутов в PHP 8 продолжается. Предыстория была в канале.
Вкратце: сначала был
<< >>
, переголосовали за@@
, а теперь новый виток обсуждений.
У@@
были проблемы с парсером, но они решены благодаря нижеупомянутому RFC про неймспейсы. Тем не менее у него есть другие проблемы, и в качестве альтернативы предлагался вариант#[ ]
как в Rust, но и у него есть минусы.Дошло до того, что рассматривается вариант переголосования за новый синтаксис и перенос атрибутов в PHP 8.1, потому что фиче-фриз для 8.0 уже 4 августа. То есть либо в PHP 8.0, но с одним из
<< >>
,#[]
,@@
, либо в PHP 8.1 с чем угодно.Для последнего случая предлагаются самые разные новые варианты:
@[Attribute]
, в комментарии PHPDoc с двойной собачкой/** @@MyAttribute */
, или даже маловероятный — переделать оператор подавления ошибок из@
в@@
, а одинарную@
использовать в атрибутах.New proposal — PHP 8 Annotations / Attributes should be:
@@#[<< Annotation >>]
There, now everyone has what they want.
— Chris Emerson (@chris_emerson) July 28, 2020Еще забавно, что в ответ на письмо Дерика об ужасности
@@
, кто-то написал, чтоT_PAAMAYIM_NEKUDOTAYIM
тоже ужасен, но не тут-то было — в PHP 8 Alpha 3 он уже не отображается для пользователя. - [RFC] Treat namespaced names as single token — В PHP 8 весь неймспейс считается одним токеном. Это позволяет использовать внутри неймспейса ключевые слова, например,
namespace app\function { class Foo {} }
и избавляет от потенциальных проблем обратной совместимости при введении новых ключевых слов.Надеюсь, вам такое не приходилось встречать, но с этим изменением неймспейсы не могут содержать комментарии:
use /** Try comments */ \FullyQualified \ /* in this ugly way */ SometTotallyDifferentTrait /** also after */;
- [RFC] Saner string to number comparisons — Почти единогласно прошло предложения ломающее обратную совместимость.
В PHP 8, при сравнении чисел и строк с помощью нестрогого
==
оба операнда приводятся к строке и сравниваются как строки, если один из них не является числовой строкой.0 == 'foobar'
теперь официальноfalse
.Это также влечет за собой изменение поведения всех операторов сравнения
<=>
,==
,!=
,>
,>=
,<
и<=
, конструкцииswitch
, функций типаin_array()
,sort()
и других. - [RFC] Nullsafe operator — В PHP 8 будет новый оператор nullsafe:
?->
.
C ним вместо пачки вложенных условий можно обращаться к свойству или методу с проверкой наnull
.Например, такой приватный метод с кучей условий:
Скрытый текстможно будет заменить одной строкой:private function getUserCountry(): ?string { $session = $this->sessionStorage->getSession(); if (null === $session) { return null; } $user = $session->getUser(); if (null === $user) { return null; } if (null === $user->address) { return null; } return $user->address->country; }
$country = $this->sessionStorage->getSession()?->getUser()?->address?->country;
Прислал Валентин Удальцов (@Пых). - [RFC] Allow trailing comma in closure use lists — В конце списка use у замыканий в PHP 8 можно будет оставлять запятую по аналогии с тем, как это уже работает для аргументов и параметров функций. Скрытый текст
$f = function ( $longArgument, $longerArgument, $muchLongerArgument, ) use ( $longVar1, $longerVar2, $muchLongerVar3, // Вот тут теперь тоже можно запятую ) { ... };
- [RFC] Named Arguments — В PHP 8 будут именованные аргументы!
Теперь можно будет передавать значения в функцию или метод на основе имени параметра, а не только его позиции.
станет:htmlspecialchars($string, ENT_COMPAT | ENT_HTML401 , ini_get("default_charset"), false);
htmlspecialchars($string, double_encode: false);
Подробнее об именованных аргументах в посте stitcher.io/blog/php-8-named-arguments. - [RFC] Renamed Parameters — Проблема переименования параметров методов была основным камнем преткновения в обсуждении именованных аргументов. Именно ее пытается решить автор этого RFC.
Предлагается добавить возможность указывать внутреннее и внешнее имя параметра через двоеточие:
function callBar(Foo $internalName:externalName) { $internalName->bar(); } $x = new Foo(); callBar(externalName: $x);
Что-то подобное есть в Swift. В качестве альтернативы, возможно решение в виде атрибута@@NameAlias
. - [RFC] Make constructors and destructors return void — Отклонен.
Инструменты
Symfony
Laravel
Материалы для обучения
Аудио/Видео
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту, в твиттер или телеграм pronskiy.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 184