PHP-Дайджест № 173 (27 января – 10 февраля 2020)


    Свежая подборка со ссылками на новости и материалы. В выпуске: PHPUnit 9 и другие релизы, 3 свежих RFC предложения из PHP Internals, порция полезных инструментов, видео, подкасты и многое другое.

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



    Новости и релизы



    PHP Internals


    • [RFC] Allow function calls in constant expressions — Сейчас в объявлениях констант можно использовать только литералы, константы и операции. В этом RFC предполагается добавить возможность вызова глобальных функций (всех или подмножество) в объявлениях констант, значений по умолчанию статических свойств, статических переменных и значений по умолчанию параметров.
      Скрытый текст
              class MyClass {
              const VALUES = [1, 0];
              const C1 = count(self::VALUES);
      
              public static $p = count(self::VALUES);
      
              public function foo($param = count(self::VALUES))
              {
              static $bar = count(self::VALUES);
              }
              }
              
    • [RFC] __toArray() — Предлагается добавить новый магический метод __toArray(), который будет вызываться при явном приведении объекта к массиву, когда объект передаётся в качестве параметра функции с типом array или когда возвращается с указанием return type array.
      Скрытый текст
              class Person
              {
              protected $name;
              protected $email;
              public function __toArray()
              {
              return [
              'name' => $this->name,
              'email'  => $this->email,
              ];
              }
              }
      
              $person = new Person('John Doe', 'j.doe@example.com');
      
              $personArray = (array) $person; // вызывает __toArray()
      
              function foo(array $person) {
              var_dump($person); // Здесь массив
              }
      
              function bar(Person $person): array {
              return $person;
              }
      
              var_dump(bar($person)); // и здесь массив
              
    • [RFC] Userspace operator overloading — Рассматривается возможность реализовать перегрузку операторов в PHP. Предложение пока в статусе черновика, но активно обсуждается в Internals. А тем временем перегрузку операторов можно использовать в PHP 7.4 на основе lisachenko/z-engine.
    • [RFC] Validation for abstract trait methods — Сигнатуры абстрактных методов из трейтов не валидируются на соответствие реализации. То есть вот такой код сейчас работает без ошибок:
      Скрытый текст
              trait T {
              abstract public function test(int $x);
              }
      
              class C {
              use T;
      
              // Работает сейчас, но не должно из-за несоответствия типов
              public function test(string $x) {}
              }
              

      Предлагается исправить это поведение.
      Ранее было опубликовано в виде пул-реквеста, но присутствует обратная несовместимость, которая требует пройти через RFC-процесс: если в текущем коде объявлен реализован абстрактный метод из трейта с другой сигнатурой, то изменение вызовет ошибку.
    • Предложения на голосовании: Static return type, Variable Syntax Tweaks, Allow ::class on objects, declare(function_and_const_lookup='global')
    • Дженерики в PHP — Никита Попов опубликовал результаты исследования возможности реализации дженериков в PHP.
    • php/doc-en — Документацию PHP на английском теперь можно редактировать через пул-реквесты на GitHub вместо старого редактора edit.php.net.

    Инструменты



    Symfony



    Laravel



    Async PHP



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



    Аудио/Видео



    Занимательное


    • bragful/ephp — Интерпретатор PHP на чистом Erlang.
    • Xdebug cloud — На video конференции SunshinePHP (на 47:45) Derick Rethans рассказал о новом проекте, цель которого упростить настройку Xdebug, особенно в случаях, когда могут быть трудности с сетью (Docker, удалённый сервер и тп). По сути – прокси.
    • PhpQuiz — Telegram-канал, на котором публикуются задачи по PHP, архитектуре, PSR-стандартам и фреймворкам.

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

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

    Telegram-канал: PHP Digest.

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

    Комментарии 14

      0
      Предлагается добавить новый магический метод __toArray()

      Это предлагалось давным-давно, но были какие-то проблемы. Вот нашел на stackoverflow:
      See, we have __toString as it is supported in language constructs like echo, print and other internal functions. But we decided against an autoconversion for arrays already. So itwill never be supported in any language construct. That said there is no needed for this and nothing you would win against the above interface. In fact you would make it php more complex because you'd add just one more magic feature.
        0
        Ну я проблемы не увидел, увидел только что человеку легче говнокодить или юзать либы/фреймворки, чем принять и запомнить, что у него есть прекрасный метод который можно задефайнить и всё будет чики-пуки.
          –1

          Чем не угодил ArrayAccess ? Зачем плодить одно и то же?

            0

            Оно скорее аналог JsonSerializable

              +2
              Надо имплементить интерфейс и 4 метода. И ArrayAccess всё таки немного другое.
          +1
          Реализация аналога конструкции match из Rust на PHP с помощью стрелочных функций.

          It's not as nice as Rust's match keyword, but once you start using PHP for functional programming (yep, that's a thing) I expect it will come in quite handy.

          Match работает с паттернами сопоставления, не представляю, как подобное можно реализовать в языке без АТД и паттернов.

            0

            Статическая типизация без дженериков это какой-то мазохизм. Ты вроде можешь тайпхинтить, но как только дело касается массивов — здравствуй phpdoc. В итоге тип прописан и в самом методе и в документации к нему. И коллекций нормальных не появится, покуда нет дженериков. Зато для массивов хотят магии добавить — просто рука-лицо.

              +2
              Проблема в том, что в пхп нет статической типизации. Все проверки идут в рантайме.
              А если мы возьмем для проверки типов до запуска тот-же psalm то окажется, что там генерики уже есть.
                0

                Ну попробуйте в метод с тайпхинтом int передать что-то другое, получите рантайм исключение. Вот в typescript рантайма нет, а дженерики есть. И я знаю про статические анализаторы типа plasm и phpstan, что-то у них тоже есть дженерики, вас это не сиущает? Смысл тогда в php вообще внедрять тайпхинты, чтобы потом их в двух местах дублировать?

              0
              Уже несколько месяцев скрестив пальцы слежу за репозиторием на гитхабе, где обсуждался rfc по дженерикам. Когда увидел сообщение Никиты о том, что он написал пробную версию реализации — перехватило дух :) Но с тех пор — тишина, на его предложение принять участие в обсуждении никто не отреагировал… Становится тревожно за всю эту затею.
                0
                Вроде сам Никита писал, что там есть определенные проблемы с внедрением
                +1
                Спасибо за хорошую подборку :)
                  +2
                  php/doc-en — Документацию PHP на английском теперь можно редактировать через пул-реквесты на GitHub вместо старого редактора edit.php.net.

                  Интересно, как оно будет работать с revision? В других языковых ветках всё на него завязано.

                    +2
                    haruncpi/laravel-log-reader — Пакет для красивого отображения логов в админке.
                    — крайне сырой и коряво работающий пакет без нормальной документации

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое