PHP-Дайджест № 194 (1 – 14 декабря 2020)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Свежая подборка со ссылками на новости и материалы. В выпуске: Enum в PHP 8.1, удаление Serializable и ограничение $GLOBALS, а также другие новости из PHP Internals, PhpStorm 2020.3, Symfony UX, порция полезных инструментов, видео, и первый PHP Дайджест Стрим.

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



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


  • habr PhpStorm 2020.3: PHP 8, атрибуты, PHPStan и Psalm, Xdebug 3, Tailwind CSS и совместная разработка.
  • Slack куплен за $27 млрд — Примечательно, то что бекенд Слэка изначально написан на PHP, а позже расширен на Hack.
  • WordPress 5.6 — C бета-поддержкой PHP 8.
  • Статистика версий PHP – 2020.2 — Традиционная подборка статистики на основе данных, которые Composer отправляет при подключении к packagist.org.
    PHP 7.4: 42.61% (+22.55)
    PHP 7.3: 27.05% (-3.00)
    PHP 7.2: 15.28% (-12.21)
    PHP 7.1: 7.45% (-4.1)
    PHP 5.6: 2.71% (-2.28)
    PHP 7.0: 2.70% (-1.30)

PHP Internals


  • [RFC] Deprecate passing null to non-nullable arguments of internal functions — В текущих версиях PHP стандартные функции без ошибок принимают null в качестве аргумента даже, когда параметр не nullable. Например, str_contains("", null)

    Проблема в том, что если объявить пользовательскую функцию с такой сигнатурой, то там аргумент null вызовет ошибку.
    str_contains("", null);
    // > No errors
    
    function _str_contains ( string $haystack , string $needle ) : bool
    {
        return true;
    }
    
    _str_contains("", null);
    // > Fatal error: Uncaught TypeError: Argument 2 passed to _str_contains() must be of the type string, null given
    

    Предлагается поэтапно исправить это несоответствие и в 8.1 бросать deprecation notice.

    Ну а пока можно добавить declare(strict_types=1); и проблема решена.
  • [RFC] Restrict $GLOBALS usage — Сейчас, чтобы $GLOBALS вел себя как массив, приходится поддерживать еще один специальный тип INDIRECT и предоставлять прямую ссылку на внутреннюю таблицу символов PHP. Поддержка этого влияет на производительность всех операций с массивами в PHP.

    В этом RFC Никита Попов предлагает ограничить использование $GLOBALS.

    Продолжат работать чтение, запись, 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».
  • [RFC] Phasing out Serializable — В 7.4 был введен новый механизм сериализации: наряду со старым интерфейсом Serialiazable были добавлены магические методы __serialize() и __unserialize().

    Предлагается постепенно полностью избавиться от Serializable. В PHP 8.1 его использование будет генерировать deprecation notice, а в PHP 9.0 — compile-time error.
  • [RFC] Enumerations — Ilija Tovilo и Larry Garfield провели исследования enum во всех языках и представили RFC, который вдохновлен Swift, Rust, и Kotlin.

    Enum это по сути класс, а его возможные значения — это объекты. Это означает, что, на вопрос «как бы вели себя Enums в ситуации X» можно ответить «так же, как и любой другой объект». Но есть несколько исключений.

    Описывается с помощью ключевых слов enum и case:
    enum Suit {
      case Hearts;
      case Diamonds;
      case Clubs;
      case Spades;
    }

    Переменным можно присваивать одно из значений:
    $val = Suit::Diamonds;
    
    function pick_a_card(Suit $suit) { ... }
    
    pick_a_card($val);        // OK
    pick_a_card(Suit::Clubs); // OK
    pick_a_card('Spades');    // TypeError

    Enum ведут себя как синглтон-объекты:
    $a = Suit::Spades;
    $b = Suit::Spades;
    
    $a === $b; // true
    
    $a instanceof Suit;         // true
    $a instanceof Suit::Spades; // true

    Есть возможность объявить скалярные Enum. Их можно прозрачно использовать в контексте, где ожидаются скалярные значения:
    enum Suit: string {
      case Hearts = 'H';
      case Diamonds = 'D';
      case Clubs = 'C';
      case Spades = 'S';
    }
    
    echo "I hope I draw a " . Suit::Spades;
    // prints "I hope I draw a S".

    Enum может иметь методы, в том числе статические. Пример использования метода для вывода списка опций чекбокса:
    enum UserStatus: string {
      case Pending = 'pending';
      case Active = 'active';
      case Suspended = 'suspended';
      case CanceledByUser = 'canceled';
    
      public function label(): string {
        return match($this) {
          UserStatus::Pending => 'Pending',
          UserStatus::Active => 'Active',
          UserStatus::Suspended => 'Suspended',
          UserStatus::CanceledByUser => 'Canceled by user',
        };
      }
    }
    
    foreach (UserStatus::cases() as $key => $val) {
      printf('<option value="%s">%s</option>\n', $key, $val->label());
    }


    Из открытых пока еще вопросов остаются:
    • Могут ли иметь свои методы значения case?
    • Можно ли использовать конкретное значение в качестве тайпхинта? function stuff(Suit::Heart|Suit:Diamond $card) { ... }
    • Разрешена ли сериализация Enum?
    • Должно ли слово enum быть полностью ключевым? Тогда сломается весь код, который использует имя класса Enum. Или стоит сделать контекстное ключевое слово вот так: enum class UserStatus {...}
  • [RFC] Algebraic Data Types — Предложение про Enum является первым шагом большого плана по реализации алгебраического типа в PHP. В качестве *возможных* дальнейших шагов рассматриваются tagged unions и pattern matching.
  • [RFC] Direct execution opcode file without php source code file — Предлагается сделать возможным сохранять бинарный файл опкеша и запускать его уже без исходника. По сути, что-то очень похожее на питоновские файлы .pyc / .pyo.

    Формат опкода в PHP нестабилен и несовместим от версии к версии. Чтобы решить эту проблему, предлагается скомпилированный таким образом файл помечать в начале меткой <?phpo%php_version_id%.

    Такой файл можно будет подключать через стандартные функции include(), include_once(), require(), require_once().
  • [RFC] Wall-Clock Time Based Execution Timeout — PHP измеряет всякого рода таймауты используя процессорное время. Это значит время затраченной в sleep() или сетевых запросах не учитывается. Например, это влияет на использование ini-настройки max_execution_time.

    В данном RFC всего лишь предлагается ввести новую установку max_execution_wall_time, которая бы учитывала реальное время вместо процессорного.

Инструменты


  • itsgoingd/clockwork v5.0 — Отладочная панель и расширение для Chrome, которое добавляет вкладку в dev tools для отладки PHP-приложений. Подробный разбор инструмента смотрите в video Пятиминутке PHP.
  • nicofff/LazyIter — Библиотека для работы с массивами в виде цепочек вызовов. Вдохновленная итератором из Rust. Пост про строгую типизацию в поддержку.
  • veewee/composer-run-parallel — Позволяет параллельно запускать команды из секции «scripts» в composer.json.
  • clue/phar-composer — Берет проект с composer.json и создает исполняемый архив phar со всеми зависимостями.
  • clue/commander — Для быстрого создания консольных команд.
  • quasilyte/phpgrep 1.0 — Инструмент для поиска по PHP-коду – как grep, только с «пониманием» синтаксиса PHP.

Symfony


  • Symfony UX — Новый инструментарий экосистеме Symfony для быстрого создания фронтенд-компонентов с помощью npm, Webpack Encore и Stimulus js. По сути предоставляются PHP+JS виджеты, которые устанавливаются через Composer: symfony/ux.
  • Неделя Symfony #728 (7-13 декабря 2020)
  • Делаем Action-Domain-Responder на Symfony
  • Symfony и гексагональная архитектура
  • video Symfony Workshop 2020 — Пополняющийся курс по Symfony.

Laravel


  • Представлен Laravel Sail — CLI-инструмент для работы запуска Laravel-приложений в Docker.
  • tailflow/laravel-orion 1.0 — Пакет для автоматического создания REST API по Eloquent-моделям и их отношениям.
  • asantibanez/laravel-eloquent-state-machines — Машина состояний (конечный автомат) для Eloquent моделей. Полезно, когда сущность может переходить из состояния в состояние по определенным правилам.
  • lukeraymonddowning/honey — Инструмент-приманка для защиты от спама.
  • habr Как обновить October CMS до Laravel 6?
  • video Стрим Laravel Internals #2 — с разработчиками из команды Laravel.
  • video Laravel at Scale: Framework, Community & Ecosystem — Интервью из Тейлором.
  • habr Laravel–Дайджест (6–13 декабря 2020)

Yii


  • Yii 1.1.23 — C поддержкой PHP 8.
  • yiisoft/cookies — Еще один пакет из семейства Yii 3. Поможет при работе с куки-файлами в среде PSR-7.
  • habr SOLID на практике. Принцип открытости-закрытости и ActiveQuery Yii2

Async PHP


  • clue/reactphp-zenity — Обертка над Zenity для создания GUI приложений на PHP. Работает из коробки на Ubuntu.

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


  • Профилирование PHP-приложений на продакшне — Пост от разработчиков Wikipedia, о том как они используют два своих инструмента: wikimedia/php-excimer – сэмплирующий профайлер и wikimedia/arc-lamp – сборщик трейсов и генератор флейм-графиков.
    We ingest about 3 million samples daily from a cluster of 150 Apache servers in any given data centre, using a 60s sample interval. These are all received by a single Redis instance.
  • AWS Lambda теперь может запускать PHP, используя контейнеры Docker
  • Переносим билды с Travis CI на GitHub Actions — Подборка ресурсов в связи с тем, что Travis CI изменил ценовую политику и теперь не бесплатный для опенсорса.
  • php.watch: Детально о JIT в PHP 8
  • Как должен выглядеть Faker 2.0 — Автор популярной библиотеки Faker прекратил работу над ней и теперь развивается форк. На обсуждение представлен документ с примерами использования следующей версии Faker.
  • Руководство по разработке расширений для PHP от Zend
  • habr НЕкостыль: gRPC-клиент на PHP в продакшене
  • habr Сравним C++, JS, Python, Python + numba, PHP7, PHP8, и Golang на примере расчёта “Простое Число”
  • habr Простой Telegram бот, который задаёт 1 вопрос
  • habr Улучшаем архитектуру: Инверсия и внедрение зависимостей, наследование и композиция
  • ru Масштабирование MySQL в Slack с помощью Vitess
  • dollar Книга «PHP для веба» от Matthias Noback теперь на русском. — Перевод книги подготовил lex111, один из мейнтейнеров русской документации PHP.

Аудио/Видео


  • noob Видеокурс по PHP на 6.5 часов для абсолютных новичков
  • noob Intro to PHP | Learn PHP The Right Way — Еще один видеокурс для новичков.
  • noob Видеокурс ООП в PHP для новичков
  • noobru Пишем Блог на PHP — И еще для новичков.
  • Что нового в PHP 8.0 — Подробный разбор новинок в PHP.

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


  • Доступен в продаже новый слоник в честь 15-летия Symfony



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



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

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

Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 193
Источник: https://habr.com/ru/post/532950/


Интересные статьи

Интересные статьи

Свежая подборка со ссылками на новости и материалы. В выпуске: Последний релиз-кандидат PHP 8.0 перед финальным релизом и свежие материалы по PHP 8, RFC и обсуждения из PHP Internals, п...
Полное руководство по аутентификации в Laravel. Новый фасад для ограничения скорости запросов. Быстрое параллельное тестирование. Стрим Тейлора: видео и текстовое резюме. Видеокурс по...
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него. Читать дальше →
Свежая подборка со ссылками на новости и материалы. В выпуске: 2 принятых, 2 отклоненных и 6 новых RFC предложений из PHP Internals, обзор PHP 8, порция полезных инструментов, онлай...
Рон Пресслер собрал и выложил новый «официальный» прототип Project Loom (файберы для Java). В качестве основы используется JDK 14. Скачать можно здесь, прочитать анонc можно здесь. Люди потих...