PHP-Дайджест № 171 (1 – 13 января 2020)


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

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



    PHP Internals


    • [RFC] Variable Syntax Tweaks — В PHP 7 был исправлен ряд неконсистентностей в синтаксисе переменных Uniform Variable Syntax RFC. Некоторые упущения, связанные с разыменованием, предлагается доисправить в PHP 8.
    • [RFC] Static return type — Ключевое слово static в контексте декларации типа означает позднее статическое связывание. Предлагается сделать возможным его использование в качестве возвращаемого типа методов. Удобно в текучих интерфейсах или статических конструкторах.
      Скрытый текст
      class Test {
          public function doWhatever(): static {
              // Do whatever.
              return $this;
          }
      }
      
      Для свойств класса и параметров методов это не имеет смысла и работать не будет.
    • [RFC] Allow ::class on objects — В PHP 8 предлагается сделать возможным получение полного имени класса из объекта $object::class по аналогии с тем, как это работает сейчас Foo\Bar::class.
    • [RFC] «use global functions/consts» statement — Если функция или константа используются без префикса, то PHP попытается сначала найти их в текущем неймспейсе, а затем в глобальном. Автор предлагает добавить директивы use global functions; и use global consts;, которые заставят интерпретатор функции и константы без префиксов по-умолчанию искать в глобальном пространстве.
    • [RFC] Weak maps — Предложение принято и WeakMaps будут доступны в PHP 8.

      Несколько изменений доступны в виде пул-реквестов:
    • [PR] Deprecate required param after optional — В данном реализовано предупреждение об использовании обязательного параметра после опционального в сигнатуре функции:
      function test(FooBar $param = null, $param2)

      Раньше это могло иметь смысл, но с nullable типами можно написать function test(?FooBar $param, $param2).
    • [PR] Check abstract method signatures coming from traits — Сигнатуры абстрактных методов из трейтов не валидируются на соответствие реализации. То есть вот такой код сейчас работает без ошибок:
      Скрытый текст
      trait T {
          abstract function neededByTheTrait(int $a, string $b);
      }
      class C {
          use T;
          function neededByTheTrait(array $a, object $b) {}
      }
      
      Пул-реквест исправляет это поведение.
    • [PR] Ensure correct signatures for PHP magic methods — А в этом PR, реализована проверка сигнатур магических методов. На данный момент она есть только для __toString() и __clone(), а вот такое, например, работает без ошибок:
      Скрытый текст
      class Foo {
      	function __get(int $name) {}
      }
      
      (new Foo)->{42};
      

    Инструменты


    • nikic/PHP-Fuzzer — Экспериментальный фазер для PHP-библиотек от Никиты Попова. Инструмент генерирует случайные входные данные для функций и может помочь найти неожиданные баги.
    • lukanetconsult/network-address-types — Набор типов для представления сетевых адресов в PHP.
    • carlosas/phpat — Статический анализатор для тестирования архитектуры. Предоставляет набор селекторов и правил.
    • maglnet/ComposerRequireChecker — Инструмент проверит, что все используемые зависимости вашего проекта указаны явно в composer.json.
    • php-service-bus/service-bus — Фреймворк на базе Amphp для построения приложений с использованием паттернов Saga, CQRS, EventSourcing, Message Bus.
    • tigitz/php-spellchecker — Обёртка для проверки текста на ошибки набором разных спелл-чекеров.
    • franzliedke/studio — Инструмент для разработки Composer пакетов при одновременном использовании.

    Symfony



    Laravel



    Zend / Laminas



    CMS



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




    Аудио/Видео



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

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

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

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

    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

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

      +4
      Спасибо за очередной дайджест!
        +1
        Благодарю за отличный дайджейт :)
          –1
          class Test {
              public function doWhatever(): static {
                  // Do whatever.
                  return $this;
              }
          }


          Интересно, каким образом в $this окажется родитель?
            +1
            Статик говорит не о родителе, а о текущем классе.
            Если унаследовать этот класс, то doWhatever будет возвращать объект того самого производного класса (как и без этой rfc). Только об этом вы явно укажите в возвращаемом типе и ваше IDE будет видеть дополнительные методы из производного класса.
            Сейчас это делается через PHPDoc с помощью
            @return static
              0
              Может я что-то не понимаю, но контроль типа в возвращаемом значении должен облегчать поиск ошибок. Это rfc ещё более ужесточает требование к значению, не только объект этого типа но ещё и тот самый, метод которого используется.
              Так вот каким образом, если мы адекватны и возвращаем $this, в $this может быть что-то другое кроме именно этого конкретного объекта? Что мы в итоге контролируем?
              Или только для IDE нужно? Но это странно
                0
                Быть может, это ограничение можно прочитать как «возвращаемый тип должен быть типом производного класса». Т.е. если в производном классе вернуть объект базового класса, то словим ошибочку.
                  0
                  Именно.
                  А еще этот PR по идее должен решить проблему с методами, возвращающими сами себя в интерфейсах(сейчас мы только можем вернуть исходный интерфейс). Вот синтетический пример абсолютно рабочего кода, но при этом невалидного с точки зрения статического анализатора:
                  interface Foo
                  {
                      public function setA(int $a): Foo;
                      public function doSomeStuff();
                  }
                  
                  class Bar implements Foo
                  {
                      private array $params = [];
                      private int $a = 0;
                  
                      public function setA(int $a): Foo
                      {
                          $this->a = $a;
                          return $this;
                      }
                  
                     public function setSomeParams(array $params): self
                     {
                          $this->params = $params;
                          return $this;
                     }
                  
                      public function doSomeStuff()
                      {
                          //...
                      }
                  }
                  
                  (new Bar)
                     ->setA(1)
                      // Вот тут ИДЕ справедливо видит несовпадение типов
                     ->setSomeParams(['baz' => 1])
                     ->doSomeStuff()
                  ;
                  


                  Замена интерфейса на ключевое слово static в методе setA четко укажет, что метод возвращает себя(или хотя бы наследника), а не какую-то другую имплементацию Foo.
                    0
                    А чем
                    :self
                    в качестве возвращаемого типа плох?
                      0
                      Declaration of Bar::setA(int $a): Bar must be compatible with Foo::setA(int $a)
                      — вот этим, к сожалению.
                        0
                        Вы 7.4 пробовали?
                          0
                          Да, Вы правы, на 7.4 это валидный вариант.
                            0
                            Более того, с началом полноценного внедрения в PHP ко(нтр)вариативности для параметров и возвращаемых значений, что-то вообще не приходит в голову ни один пример, где static в качестве тайп-хинта хоть что-то добавляет.
            –4
            Странные же люди :)
            Писал nikic по поводу фичи Static return type аж 23 декабря.
            Он так и не ответил, зато через 2.5 недели после письма выкатывает RFC.
            Соавторство в 2019 2020 уже не то.
              +1
              А что писал? Давай пруфы.
                +5

                вы правда считаете, что по поводу static в return declaration писали только вы и самый первый аж 23-его декабря?) Ведь это на столько не очевидный кейс...

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

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