PHP Дайджест № 196 (1 – 11 января 2021)


    Свежая подборка со ссылками на новости и материалы. В выпуске: релиз PHP 8.0.1, MySQL движок на PHP от Vimeo и другие релизы, обновленный Enum и свежие предложения для PHP 8.1, «уязвимость» в Laminas, инструменты, статьи, видео, PHP Дайджест Live в 20:00 МСК.

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



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



    PHP Internals


    • [RFC] Enumerations, Round 2 — Предложение по Enum для PHP было сильно доработано. В частности: кейсы (значения) не могут иметь методы или константы, а сам Enum может; поддерживаются трейты без свойств; в скалярных енамах вместо метода value() теперь просто свойство. Обзор предложения был в выпуске № 194 и на стриме.
    • [RFC] Bundling ext/simdjson into core — Автор предлагает забандлить в ядро PHP библиотеку simdjson. Оно в разы быстрее чем текущее ext/json и позволяет парсить гигабайтные json за секунды.

      В обсуждении указали на то, что библиотека молодая и не доступна во многих инсталяциях. Поэтому пока лучше предоставлять ее в виде PECL расширения, а забандлить позже.
    • [RFC] Array unpacking with string keys — В PHP 5.6 была добавлена распаковка массива в аргументах:

      variadic_function(...['apple', 'banana', 'lemon']);

      А в PHP 7.4 то же самое в массивах:

      $parts = ['apple', 'pear'];
      $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
      // ['banana', 'orange', 'apple', 'pear', 'watermelon'];
      

      Но оба случая не поддерживали массивы со строковыми ключами. И поскольку с добавлением именованных аргументов в PHP 8.0 уже решен первый случай, то теперь нет причин сохранять ограничение для второго.

      В PHP 8.1 предлагается разрешить распаковку массивов со строковыми ключами:

      $array1 = ['a' => 'apple', 'p' => 'pear'];
      $array2 = ['b' => 'banana', 'o' => 'orange'];
      $array = [...$array1, ...$array2];
      // Приблизительно то же самое что:
      $array = array_merge($array1, $array2);
      
    • [PR] Use 'ENT_QUOTES|ENT_SUBSTITUTE' for HTML encoding and decoding functions — Автор пул-реквеста заметил, что функция htmlspecialchars() почти всегда используется с флагами ENT_QUOTES и ENT_SUBSTITUTE:

      • ENT_QUOTES — WordPress
      • ENT_QUOTES — Blade (Laravel)
      • ENT_QUOTES | ENT_SUBSTITUTE — Twig (Symfony or Slim)
      • ENT_QUOTES | ENT_SUBSTITUTE — CodeIgniter
      • ENT_QUOTES | ENT_SUBSTITUTE — CakePHP
      • ENT_QUOTES | ENT_SUBSTITUTE — Yii
      Предлагается сделать эти флаги включенными по умолчанию.
    • check [RFC] Restrict $GLOBALS usage — Принято единогласно. Использование $GLOBALS начиная с PHP 8.1
      будет ограничено
      Продолжат работать чтение, запись, isset и unset:
      $GLOBALS['x'] = 1;
      
      echo $GLOBALS['x']
      
      isset($GLOBALS['x']);
      unset($GLOBALS['x']);

      А вот попытка изменить саму переменную $GLOBALS вызовет ошибку:
      $GLOBALS = [];
      $GLOBALS =& $x;
      $x =& $GLOBALS;
      unset($GLOBALS);

      Также ошибка будет, если передать $GLOBALS по ссылке в функцию:
      
      asort($GLOBALS);
      // > Compile-time error

      Все это упрощает внутренности PHP и улучшает производительность операций с массивами в PHP.

    • [RFC] Concepts to improve mysqli extension — Рекомендованным механизмом для доступа к БД в PHP является PDO. Тем не менее во многих приложениях используется mysqli. У последнего есть ряд старых проблем, которые автор и предлагает решить.
    • [RFC] Add array_is_list(array $array): bool — Стартовало голосование по добавлению функции, которая вернет true, если передать в нее массив с последовательными целочисленными ключами 0, 1, 2 ... count($value)-1. Функция переименована из is_list() в array_is_list(). О причинах было подробнее на стриме.

      В Symfony уже успели сделать полифил для PHP 8.1 с этой функцией.
    • В PHP 8.1 добавлены супербыстрые алгоритмы хеширования: xxHash и MurmurHash3.

    Инструменты


    • dollar Dump Debugging Evolved — Ray — Ребятки из Spatie представили свое приложение для отладки — Ray. Добавляете вызовы ray($anything) в своем коде, и при запуске PHP-скрипта оно красиво отображается в отдельном десктопном приложении.

      Если вы осилили Xdebug, то вряд ли это имеет смысл. А если отлаживаете в стиле var_dump(...)/die(), то может быть интересно.

      Смотрите подробный video видеообзор на английском или на русском в ближайшем PHP Дайджест Live.
    • AdamGaskins/barcoder — Пакет с лаконичным интерфейсом для генерации SVG-картинок штрихкодов (QR, Datamatrix, и т.п.).
    • vimeo/php-mysql-engine — MySQL движок на чистом PHP. Пригодится, если при тестировании вы обращаетесь к базе и хотите ускорить запуск тестов, эмулируя MySQL в памяти. Библиотека расширяет класс PDO и позволяет вызывать обычные методы PDO MySQL. Аккуратно: есть ограничения.
    • jvoisin/snuffleupagus — PHP-расширение блокирует запуск потенциально небезопасного кода в рантайме и избавляет от многих потенциальных уязвимоcтей. Изначально разработан для хостеров, которые, естественно, не могут редактировать код своих клиентов, но хотят сделать его безопаснее.
    • mbunge/php-attributes — Пакет для автоматического резолва/инициализации атрибутов PHP 8. Можно просто подключить автозагрузчик или использовать резолвер вручную.
    • mlocati/docker-php-extension-installer — Инструмент упрощает установку PHP-расширений в Docker.
    • php-opencv/php-opencv — Расширение для компьютерного зрения (распознавание лиц, объектов, и т. п.) и машинного обучения теперь с поддержкой PHP 8. Примеры использования.

    Symfony



    Laravel



    Yii



    Zend / Laminas


    • Итоги 2020 для Laminas Project
    • В Zend Framework / Laminas зарепортили уязвимость — Суть «уязвимости» можно понять из этого примера:

      class MyClassWithToString {
          public $name;
      
          public function __construct($name) {
              $this->name = $name;
          }
      
          public function __toString() {
              return (string) $this->name;
          }
      }
      
      $input = unserialize('O:19:"MyClassWithToString":1:{s:4:"name";s:15:"/tmp/etc/passwd";}');
      if ($input instanceof MyClassWithToString) {
          unlink($input);
      }

      Во фреймворк запушили исправление с проверкой на is_string() перед тем как делать unlink(). Но если посмотреть внимательнее, то уязвимость касается десериализации данных от пользователя. А на php.net красным написано, что не стоит использовать unserializie() в подобных случаях.

      Более того, с 2017 года ошибки десериализации больше не считаются ошибками безопасности, просто потому что unserialize() никогда не будет безопасным (не только в PHP).

      Вот еще свежий пост об эксплуатации подобных багов на примере Yii.

    Async PHP


    • Swoole PHP 4.6.0 — В свежем релизе асинхронного движка добавлен нативный асинхронный сURL.
    • amphp/mysql-dbal — Концепт асинхронного драйвера для Doctrine DBAL/ORM на базе Amphp v3.

    Статьи



    Аудио/Видео



    Сообщество







    Сегодня будет третий стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и деталями, обзор присланного, интересное но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.
    Начало в 20:00 Москва, Минск / 19:00 Киев.



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

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

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

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 13

      +3
      Спасибо, Роман
        +1

        Слоники слоники, слоники....))
        Наконец доку перенесли, есть места не переведены которые, либо вообще док отсутствует

          +1
          8 лет назад в след за самим php, помогал в подготовке к переносу документации в git и адаптации под это дело сайта edit.php.net. За это время столь много воды утекло, и столько было попыток от разных людей, что я уже и не верил больше. Молодцы!
            +1
            По поводу enum: я ждал этого функционала уже более 5 лет, но в результате получаем не то, что ожидали.
            Для чего вся эта мишура с трейтами и т. д?
            Почему не сделать как в c++?

            А про распаковку массива с ключами как именованные аргументы это уже совсем…
            Кому это надо? Это потенциальное место, где будут копиться баги.
            И всем разработчикам, которые хотят распаковать массив в аргументы функции, надо заботиться, чтобы ключи были не именованные, а если забыл, то могут быть случайные совпадения ключей и наименований аргументов.
            Дополнительно, при рефакторинге функции/метода, надо помнить о возможных входных данных и все это учитывать.

            На мой взгляд php начал развиваться в не том направлении.
            Слишком много уделяется внимание всяким бесполезным штучкам.
            Взять нормальный функционал у одного языка, и сделать из него елку.
              +6

              Ох, простите, что люди провели исследование енамов во всех популярных языках и в свое свободное время бесплатно сделали не то, что вы ожидали.

                0

                если люди потратили время и сделали функционал, это же не значит, что функционал должен радовать всех ?


                PS.: я не один ждал этого функционала, и те, кто ждал, сталкивались со сложностями, которые легко решались бы через enumerations.
                и enum — нужен только для группировки набора значений и возможность принимать один из объявленных значений.


                enum COLOR {
                    RED = 1,
                    GREEN,
                    BLUE
                }
                
                function f(COLOR $color) { echo $color; }
                
                f(COLOR::GREEN); // print 2
                f(10); // fatal error

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

                  0

                  Страшно представить, что будет с долгожданными дженериками.

                    +1

                    Ничего не будет ¯\_(ツ)_/¯

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

                    В общем-то согласен, что это основное. А дополнительные плюшки — ну так про любые фичи можно сказать, что они усложняют код.


                    Для вдохновения взяты отличные языки (Kotlin, Swift, Rust), так что думаю в использовании будет отлично. https://github.com/Crell/enum-comparison#summary

                      0

                      енумы часто текстовые (натуральные ключи) С таким синтаксисом есть гарантии что значения одного типа в енумк и могут быть переданы параметром в функцию с примитивным тайпхинтом string?

                        +3
                        В PHP идет куда более мощная разработка АТД, чем вы ожидаете от простых скалярных перечислений

                        Примеры:
                        Match Enhancement: wiki.php.net/rfc/pattern-matching#match_enhancement
                        State machine: wiki.php.net/rfc/enumerations_and_adts#state_machine
                        Maybe Monade: wiki.php.net/rfc/tagged_unions#examples
                        Ваш простой вариант: wiki.php.net/rfc/enumerations_and_adts#primitive-equivalent_cases

                        Получается очень мощные штуки, которые даже в др языках с трудом пытаются вместить
                      0
                      Почему не сделать как в c++?

                      Как в языке, который рассматривают в качестве варианта только для очень специфичных требований?

                        +2
                        По поводу enum: я ждал этого функционала уже более 5 лет, но в результате получаем не то, что ожидали.
                        Для чего вся эта мишура с трейтами и т. д?
                        Почему не сделать как в c++?

                        Вы забыли указать ссылку на ваш RFC пятилетней давности.

                      Only users with full accounts can post comments. Log in, please.