PHP-Дайджест № 185 (20 июля – 3 августа 2020)

uitjr63f89-4m1dnefvy-wcdf10.jpeg

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 Alpha 3, PhpStorm 2020.2, новый оператор ?->, снова обсуждение синтаксиса атрибутов и другие новости PHP Internals, обзор системы типов в PHP, порция полезных инструментов, видео, стримы и многое другое.

Приятного чтения!


f574e9991c42407b8fa789a66b854f8d.png Новости и релизы


  • PHP 8.0.0 Alpha 3 — Последний альфа-релиз из запланированных. Первая бета ожидается 6 августа.
  • Релиз PhpStorm 2020.2 — Объединенные типы PHP 8, новый движок потока управления, пул-реквесты GitHub, OpenAPI. По ссылке подробный разбор этих и других изменений.


c9ee7880391644e4aef6cc28ca681ab0.png PHP Internals


  • awvcz5jqj8-8mmnsmnaat51srze.png[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 он уже не отображается для пользователя.

  • check[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 */;
  • check[RFC] Saner string to number comparisons — Почти единогласно прошло предложения ломающее обратную совместимость.

    В PHP 8, при сравнении чисел и строк с помощью нестрогого == оба операнда приводятся к строке и сравниваются как строки, если один из них не является числовой строкой.

    0 == 'foobar' теперь официально false.
    3polnca0db7p1jwejuzfs_6yo-o.png

    Это также влечет за собой изменение поведения всех операторов сравнения <=>, ==, !=, >, >=, < и <=, конструкции switch, функций типа in_array(), sort() и других.

  • check[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;

    Прислал Валентин Удальцов (@Пых).
  • check[RFC] Allow trailing comma in closure use lists — В конце списка use у замыканий в PHP 8 можно будет оставлять запятую по аналогии с тем, как это уже работает для аргументов и параметров функций.
    Скрытый текст
    
    $f = function (
        $longArgument,
        $longerArgument,
        $muchLongerArgument,
    ) use (
        $longVar1,
        $longerVar2,
        $muchLongerVar3, // Вот тут теперь тоже можно запятую
    ) {
       ...
    };
    
  • check[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.
  • awe5ahpwpbdazasl4dd0drngj1q.png[RFC] Renamed Parameters — Проблема переименования параметров методов была основным камнем преткновения в обсуждении именованных аргументов. Именно ее пытается решить автор этого RFC.

    Предлагается добавить возможность указывать внутреннее и внешнее имя параметра через двоеточие:

    
    function callBar(Foo $internalName:externalName) {
        $internalName->bar();
    }
    
    $x = new Foo();
    callBar(externalName: $x);
    

    Что-то подобное есть в Swift. В качестве альтернативы, возможно решение в виде атрибута @@NameAlias.
  • cross[RFC] Make constructors and destructors return void — Отклонен.


cf862d9072784d04b621238ec137f2ca.png Инструменты


96b65e92179a40f2bd1884549973ddd5.png Symfony


314bd0f0dfc54e3fa7f0c0daef1a2d25.png Laravel


329bec7c1e914963a1c5d2f2bfe99995.png Материалы для обучения


8dcc236774104f8286a40ceaea553820.png Аудио/Видео

Спасибо за внимание!

Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту, в твиттер или телеграм pronskiy.

Больше новостей и комментариев в Telegram-канале PHP Digest.


Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 184

© Habrahabr.ru