Pull to refresh

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

Reading time 5 min
Views 14K

Свежая подборка со ссылками на новости и материалы. В выпуске: 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 */, или даже маловероятный — переделать оператор подавления ошибок из @ в @@, а одинарную @ использовать в атрибутах.



    Еще забавно, что в ответ на письмо Дерика об ужасности @@, кто-то написал, что 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.


    Это также влечет за собой изменение поведения всех операторов сравнения <=>, ==, !=, >, >=, < и <=, конструкции 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.
  • [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 — Отклонен.

Инструменты



Symfony



Laravel



Материалы для обучения



Аудио/Видео



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

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

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

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

Tags:
Hubs:
+63
Comments 22
Comments Comments 22

Articles