Русский
Русский
English
Статистика
Реклама

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


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

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



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


  • habrPhpStorm 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 errorsfunction _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);        // OKpick_a_card(Suit::Clubs); // OKpick_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



Laravel



Yii



Async PHP


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

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



Аудио/Видео



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




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



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

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

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 193
Источник: habr.com
К списку статей
Опубликовано: 14.12.2020 14:08:42
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Разработка веб-сайтов

Php

Symfony

Yii

Laravel

Дайджест

Php-дайджест

Php 8.1

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru