PHP-Дайджест № 148 (14 – 28 января 2019)


    Свежая подборка со ссылками на новости и материалы. В выпуске: взломан репозиторий PEAR, о будущем Xdebug, конференция PHP Russia 2019, свежие релизы, RFC предложения из PHP Internals, порция полезных инструментов, и многое другое.

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



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


    • Репозиторий PEAR был взломан — Сайт pear.php.net ушел в офлайн и не работает до сих пор. Известно, что в файл go-pear.phar был внедрен вредоносный код. Вы под угрозой, если вручную скачивали этот файл после 20.12.2018. Чтобы проверить надо скачать «чистый» файл с GitHub и сравнить контрольные суммы. Для автоматизации имеется скрипт. Если вы использовали ОС с предустановленным PHP или устанавливали с помощью пакетного менеджера, то крайне маловероятно, что вы когда-либо использовали go-pear.phar. Пока сайт не работает есть обходные пути для установки PEAR-пакетов и сборки PHP из исходников.
    • Будущее Xdebug — Автор Xdebug Derick Rethans рассказал о техническом долге и проблемах расширения. Он уходит из MongoDB, где проработал последние 7 лет. В ближайшее время намерен заняться рефакторингом и доработкой Хdebug, а также ищет пути финансирования. Поддержать Дерика можно на его Patreon.
    • Кто оплачивает разработку PHP? — В конце поста говорится о том, что организация igphp.de совместно с некоторыми ключевыми членами команды PHP планируют решение проблемы финансирования и поддержки PHP, и в скором времени анонсируют его.
    • Компания Perforce поглотит Rogue Wave Software
    • PhpStorm 2019.1 EAP — Стартовала программа раннего доступа PhpStorm, благодаря которой можно первым пощупать новые возможности IDE совершенно бесплатно. Среди нововведений: отладка шаблонов Twig, возможность сортировки импортов (use выражений), поддержка phpcbf для исправления ошибок стиля, и много других улучшений.
    • ru Onliner PHP Meetup #3 — Минск, 9 февраля.
    • ru PHP Russia 2019 — 17 мая в Москве состоится специализированная PHP-конференция!
      О том, как появилась идея и о команде можно прочитать в посте Александра Макарова. Полным ходом принимаются заявки на доклады. А также в Telegram доступны официальный канал @PHPRussiaConfChannel и чат @PHPRussiaConfTalks с обсуждениями.

    PHP Internals


    • [RFC] Null Coalescing Assignment Operator — Предложение было принято больше двух лет назад. И вот реализация комбинированного оператора с проверкой на null ??= наконец-то закончена и смержена. Несмотря на кажущуюся простоту задачи, имплементация оказалась весьма нетривиальной.
      Итого: $a ??= $b эквивалентно $a ?? ($a = $b). В случае $a[foo()] ??= bar() функция foo() будет вызвана ровно один раз, а bar() будет вызвана, если $a[foo()] равно null (или не установлено).
      В тему хороший пост о других коротких операторах в PHP.
    • [RFC] New custom object serialization mechanism — Свежий RFC от Никиты Попова. Предлагается ввести новый механизм сериализации объектов, добавив пару магических методов:

      // Returns array containing all the necessary state of the object.
      public function __serialize(): array;
       
      // Restores the object state from the given data array.
      public function __unserialize(array $data): void;
      

      Данное изменение призвано исправить проблемы интерфейса Serialiazable. К сожалению, исправить сам интерфейс невозможно, но в случае принятия предложения будет рабочая альтернатива.
    • [RFC] Code free constructor — Предлагается добавить автоматический конструктор, задача которого инициализировать свойства:
      Скрытый текст
      class MotorCycle {
          public $vendor;
          public $cc;
          public $whells = 2;
       
          public function __construct($vendor, $cc) {
              $this->vendor = $vendor;
              $this->cc     = $cc;
          }
       
          //other methods
      }
       
      class MyCustomMotorCycle extends MotorCycle {
          public function __construct($cc, $whells) {
              parent::__construct("Custom", $cc);
           // $this->cc = $cc;  this statement will be added within proposed realisation
              $this->whells = $whells;
          }
      }
      

      для кода выше предлагается следующий альтернативный синтаксис:
      class MotorCycle($vendor, $cc){
          public $whells = 2;
       
          //other methods
      };
       
      class MyCustomMotorCycle($cc, $whells) extends MotorCycle("Custom", $cc){ };
      


    Инструменты


    • API Platform — Фреймворк на базе компонентов Symfony для создания API. В новой версии поддержка MongoDB, Elasticsearch, OpenAPI v3 и много другого.
    • xobotyi/php-mime-type — Библиотека позволяет определить известные расширения по MIME-типу и наоборот. Прислал xobotyi.
    • PHPStan 0.11 — Статический анализатор для PHP. Анонс релиза. Вдогонку видео о внутренностях PHPStan от одного из мейнтенеров.
    • Symplify/Statie — Простой генератор статических сайтов на PHP. Быстрый старт.
    • leocavalcante/siler — Микрофреймворк реaлизован на простых функциях без использования классов. Можно использовать со Swoole
    • directus/directus — Headless CMS c API.
    • mgp25/Instagram-API — Библиотека дает возможность использовать скрытые в официальном API возможности Instagram.
    • bmitch/churn-php — Инструмент поможет найти кандидатов на рефакторинг – файлы, которые больше всего изменялись в истории Git и имеют наибольшей цикломатической сложностью.

    Symfony



    Laravel



    Async PHP


    • dantleech/fink — Инструмент для проверки сайта на битые ссылки. Реализован с использованием amphp/artax.
    • reactphp/child-process v0.6.0 — Событийная библиотека для работы с дочерними процессами с помощью ReactPHP. Теперь с поддержкой Windows. Подробнее в посте.

    CMS



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




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


    • Code Galaxies — Забавная 3D визуализация взаимосвязей между Composer-пакетами.

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

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

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

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

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

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

      +1
      yii теперь только в тегах… (
      +2

      Про EAP Шторма забыли? :) Обычно вроде пишете.

        0
        Да :-) добавил, спасибо!
        +1
        [RFC] Code free constructor

        Резиденты internals настроены скептически, а жаль.
          0
          Репозиторий PEAR был взломан — Сайт pear.php.net ушел в офлайн и не работает до сих пор.

          Хм, а кто-нибудь этим PEAR вообще пользуется? По-моему он уже давным-давно и так помер.

            0
            Там есть полезные расширения. Например для работы с редкими/экзотическими базами данных.
              +3

              Эм, а вы на счёт расширений с PECL не перепутали? PEAR — это как композер, только неюзабельный, древний, и как оказалось — дырявый =)


              P.S. Ой, случайно в вашей ветке ответил, не заметил. То что выше в 10:38 — это не комментарий к вашему, а к посту самому коммент.

                0
                Посыпаю голову пеплом! Аббревиатуры — такие аббревиатуры.
            +1
            Этот RFC как минимум не доработан. Там в качестве проблемы указана перезапись родительской переменной, но ведь это давно решено например в Kotlin если используется модификатор доступа, то это поле класса, а если нет, то локальный параметр используемый только в конструкторе. Такая-же история и с анонимными классами. Отсюда и скепсис. Никто не хочет внедрять полурабочую фичу.
              0
              Не совсем так. Что Никите Попову, что Себастьяну Бергману не нравится именно предложенный синтаксис.
              > I think that *if* we want to add some kind of sugar of this type, then I'd
              > strongly prefer the syntax used by Hack than the one proposed here.
              Agreed.

              Проблемы с перезаписью и включение анонимных классов в скоп не являются проблемами в том смысле, что они достаточно просто решаемы — на то оно и обсуждение, чтобы учесть неучтенное. А вот принципиальное несогласие основных ментейнеров с подходом — вот это большая проблема.

              PS С другой стороны, дискуссия про изничтожения бойлерплейта в конструкторе в принципе завязалась, что хорошо :)
            +1
            xobotyi/php-mime-type — Библиотека позволяет определить MIME-тип по расширению.
            Не нужно так делать. С такой проверкой можно любой бинарник обозвать *.jpeg и свободно загружать на хостинг. А ведь все уже давно изобретено.
              –1
              А зачем давать возможность запускать jpeg?
                0
                Никто не предлагает определять майм-тип по расширению, первоцель обратная — узнать известные расширения по майму.
                UPD: перечитал какое описание поставли… вводит в заблуждение…
                  +1
                  Я вас расстрою, указанная mime_content_type делает тоже самое, юзает mime.magic файлик, никакие сигнатуры не тестятся.
                    +6
                    Кстати, немного интриг, скандалов и расследований(с) вам в статью. :)
                    Коммит от 24 января сего года проскочили такие изменения:
                    -   | Authors: Andi Gutmans <andi@php.net>                                 |
                    -   |          Zeev Suraski <zeev@php.net>      
                    +   | Authors: Andi Gutmans <andi@zend.com>                                |
                    +   |          Zeev Suraski <zeev@zend.com>  
                    
                      +6
                      Не знаю, как вас, а меня сильно смущает магия в PHP RFC: Code free constructor, связанная с именованием аргументов конструктора (автор, кстати, сам подметил одну из проблем: Child constructor will silently rewrite parent's properties with same name). Это, имхо, прямой путь к неочевидным и трудно находимым багам. Да и вообще сам RFC выглядит каким-то недоработанным. В частности, не раскрыта тема (или я слепой) на счет областей видимости полей объекта. Не раскрыта и тема о поведении парсера/компилятора в случае приватных полей, имеющихся как у родителя, так и потомка. А что на счет отсутствия поля у объекта? Оно будет неявно объявлено как public? Или?

                      P.S. Ясно, что всё это можно теоретически вычитать из PR, но разве это не первичная задача для технической документации?
                        0
                        Ясно, что всё это можно теоретически вычитать из PR, но разве это не первичная задача для технической документации?
                        Ну, вообще-то, на странице с предложением есть ответы на большинство ваших вопросов.
                        By the way, current realization simply add “_ _construct” method into class via AST injection. Another words, code “($cc, $whells)” considered as zend_ast node “parameter_list” and accordingly processed by standart way. You can declare property type like you declare them inside standard method. Also you can declare defaults for parameters, use “…” notation (there is a nuance) and do everything else.
                        Тонкости реализации и поведения в граничных случаях — это в любом случае тема для дискуссии, а не для драфта, призванного продемонстрировать идею и синтаксис.

                        PS А вообще странно, что его в статью включили, так как это черновик на этапе самого первичного обсуждения и понятно, что вопросов еще много. А тут сразу критиков понабежало и ну давай автора расстраивать :D
                          +1
                          Интересные черновики всегда включаю. А критика это ж хорошо – быстрый фидбек от реальных пользователей PHP и возможность подправить RFC.
                          А вы не проводили анализ GitHub/Packagist на предмет того, насколько часто такой бойлерплейт код используется?
                            0
                            А вы не проводили анализ GitHub/Packagist на предмет того, насколько часто такой бойлерплейт код используется?
                            Нет, оценивал субъективно и, честно говоря, большей частью не по PHP-коду, а по JVM-языкам. Исторически сложилось, что там гораздо чаще смотришь чужой код.
                            Откровенно говоря, одним из скрытых побудительным мотивов было желание подтолкнуть разработчиков к этой практике. Эдакая завлекалочка — «теперь ты можешь сделать код лучше, написав меньше». :)
                            Понятно, что про «лучше» в этом контексте — это только одна из точек зрения. Многие согласятся, многие нет. Вот для тех, кто согласится, жизнь станет легче.
                          +1
                          В частности, не раскрыта тема
                          Постарался раскрыть
                          0
                          leocavalcante/siler — Микрофреймворк реaлизован на простых функциях без использования классов. Можно использовать со Swoole

                          Забавная штука, очень забавная, прямо заинтригован
                            –1
                            Хорошие новости. Ожиотаж вокруг php все же есть. Плохо конечно что команда дробится, но то что будет финансирование уже хорошо

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

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