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

5b8a90f8e733d0c8d7c3df62018d73a2.jpg

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

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


f574e9991c42407b8fa789a66b854f8d.png Новости и релизы



c9ee7880391644e4aef6cc28ca681ab0.png 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.

cf862d9072784d04b621238ec137f2ca.png Инструменты


  • dollarDump 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. Примеры использования.

96b65e92179a40f2bd1884549973ddd5.png Symfony



314bd0f0dfc54e3fa7f0c0daef1a2d25.png Laravel



569de4298b764a33894aa517e74324f9.png Yii



pjlkob5btqut7it5e_eod-qtqh0.png 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.

732rpqll-yvu0hrtaw6yeism-de.png Async PHP


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

329bec7c1e914963a1c5d2f2bfe99995.png Статьи



8dcc236774104f8286a40ceaea553820.png Аудио/Видео



Сообщество





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

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

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

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

© Habrahabr.ru