Новый тип never
будет в PHP 8.1, на обсуждении частичные функции, а также другие предложения и новости из PHP Internals. PHP доступен на Google Cloud Functions, о взломе git.php.net, Laravel Octane, PhpStorm 2021.1 и другие релизы, порция инструментов, видео, подкасты, статьи.
Приятного чтения!
Новости
- О взломе git.php.net
В исходники PHP злоумышленники запушили два коммита от имени Расмуса Лердорфа и Никиты Попова. Проблему быстро обнаружили и решили. Зловредный код к юзерам не попал.
Как оказалось, на сервере git.php.net были разрешены коммиты по HTTPS и использовалась дайджест-аутентификация, которая принимает md5 хэш в качестве секрета. База хэшей всех контрибьюторов была получена злоумышленниками с сервера master.php.net — именно он, по всей видимости, и был взломан первоначально.
В итоге теперь вся разработка полностью переведена на GitHub, что упрощает жизнь разработчикам языка. - PHP 7.3.28, PHP 8.0.5 — Первые релизы после фриза.
- PHP доступен на Google Cloud Functions
Serverless платформа от Google Cloud теперь нативно поддерживает PHP. С помощью GoogleCloudPlatform/functions-framework-php/ можно выполнять функции в рантайме на базе PHP 7.4.
Немного деталей есть в обсуждении на GitHub в репозитории Symfony. С Symfony 5.3 все будет работать благодаря компоненту Runtime, достаточно установить php-runtime/google-cloud.
- Composer Command Injection Vulnerability
Уязвимость в Композере затрагивает только системы с установленным Mercurial. Тем не менее стоит незамедлительно обновиться до версий 2.0.13 и 1.10.22, в которых она исправлена. Технический анализ уязвимости.
- Ближайшие мероприятия:
- 15 мая (суббота), офлайн + онлайн, Митап казанского PHP-сообщества — Говорим про тесты, трейты, kPHP, devops в монолите и опыт перехода на Go. Ссылка на трансляцию.
- 28 июня (понедельник), офлайн, Москва, PHP Russia, 2021 — 30 апреля последний день перед повышением цены.
Полный список митапов и конференций всегда доступен на phpcommunity.ru.
PHP Internals
- [RFC] never type
В PHP 8.1 будет доступен новый тип для возвращаемых значений:never
.
Функция или метод, объявленная с типомnever
, указывает, что она никогда не вернет значение и либо бросает исключение либо завершается вызовом типаdie()
,exit()
. Такой тип улучшает синтаксический анализ.
function redirect(string $uri): never { header('Location: ' . $uri); exit(); } function redirectToLoginPage(): never { redirect('/login'); }
Коротко об этом уже было в телеграме, а подробно можно почитать на php.watch, и послушать выпуск PHP Internals News с авторами.
- [RFC] Deprecate implicit non-integer-compatible float to int conversions
В PHP 8.1 при преобразованииfloat
вint
, где теряется дробная часть, будет брошено предупреждениеE_DEPRECATED
. А в PHP 9.0 будет ужеTypeError
.
function acceptInt(int $i) { var_dump($i); } acceptInt(3.1415); > int(3) // Deprecation notice
Подробнее в выпуске подкаста PHP Internals News.
- [RFC] Phasing out Serializable
В PHP 8.1 интерфейсSerializable
объявлен устаревшим. Deprecation notice будет бросаться, когда в классе используется только этот интерфейс, то есть, если в классе дополнительно нет новых магических методов__serialize()
и__unserialize()
.
- На голосовании выбраны релиз-менеджеры PHP 8.1
Всего их будет трое: опытный участник core-тимы Joe Watkins (автор pthreads, parallel и pcov), а также два новичка Patrick Allaert (blackfire.io) и Ben Ramsey (автор ramsey/uuid).
Кстати, среди номинантов был Сергей Пантелеев s_panteleev, организатор BeerPHP Ярославль. Надеюсь, Сергей станет релиз-менеджером PHP 8.2!
Новые предложения для PHP 8.1: - [RFC] Partial Function Application
Частичное применение (частичные функции) — это когда фиксируются (или биндятся) только некоторые аргументы при вызове функции, а другие остаются в качестве параметров для передачи позже.
Например, вот полная функция:
function whole($one, $two) { /* ... */ }
А вот частичная на ее основе:
$partial = whole(?, 2);
В этом случае, сигнатура частичной будет вот такой:
function($one) { /* ... */ }
Зачем это нужно?
Во-первых, теперь можно получить ссылку на любую функцию или метод и применять везде, где ожидаетсяCallable
. Например, можно будет делать вот так:
array_map(Something::toString(?), [1, 2, 3]); array_map(strval(?), [1, 2, 3]); // вместо array_map([Something::class, 'toString'], [1, 2, 3]) array_map('strval', [1, 2, 3]);
И во-вторых, как следствие, можно будет реализовать pipe-оператор|>
:
$result = "Hello World" |> htmlentities(?) |> explode(?);
Посмотреть в действии можно на 3v4l.org.
Спасибо Larry Garfield, Joe Watkins, Levi Morrison и Paul Crovella за RFC и реализацию.
- [RFC] Sealed Classes
В этом RFC предлагается добавить концепцию sealed классов, интерфейсов и трейтов.
Такие selaed-сущности могут быть использованы только в перечисленном наборе других сущностей.
Пример для классов:
sealed class Shape permits Circle, Square, Rectangle {} final class Circle extends Shape {} // ok final class Square extends Shape {} // ok final class Rectangle extends Shape {} // ok final class Triangle extends Shape {} // Fatal error: Class Triangle cannot extend sealed class Shape.
Предлагаемый синтаксис в точности копирует Java.
- [RFC] Autoload Classmap — Здесь предлагается расширить дефолтный автозагрузчик, чтоб можно было указать карту классов (массив класс => файл) и немного улучшить производительность. Но предложенные новые функции пока несовместимы с Композером, поэтому стоит ожидать обновленный RFC.
- [PR] Add support for final constants — Предлагается
final
для констант, чтоб нельзя было их переопределить в дочерних классах.
Инструменты
- spatie/data-transfer-object v3 — Продвинутые типизированные DTO на PHP 8.
- spatie/fork — Простая обертка над pcntl_fork для параллельного запуска PHP скриптов. Видео в поддержку
- squizlabs/PHP_CodeSniffer 3.6.0 — Обновление с поддержкой PHP 8.
Symfony
- symfony/ux-turbo — Не так давно автор Ruby on Rails представил мини JS-библиотеку hotwired/turbo. Ее идея в том, чтобы делать SPA, но при этом минимально писать фронтендный JS-код.
По сути, на клики и сабмиты делается фоновый AJAX-запрос и подменяется кусок страница без перезагрузки, а URL меняется с помощью pushState. Техника старая, но эффективная.
UX Turbo — это интеграция для Symfony. Также из коробки предоставляется интеграция с пуш-протоколом Symfony Mercure и можно изменения отображать у всех онлайн-пользователей автоматически.
Вот тут неплохие слайды с деталями. - dykyi-roman/crossword — Игра в кроссворды реализованная, как пример масштабируемой и высоконагруженной архитектуры на Symfony. Прислал Roman Dykyi.
- End-to-end тестирование с Symfony и Panther.
- Неделя Symfony #747 (19-25 апреля 2021)
Laravel
- laravel/octane — Пакет позволяет запускать Laravel под Swoole или RoadRunner, при этом бутстрап выполняется один раз и затем каждый запрос обрабатывается одним и тем же инстансом приложения. Подробнее о том, что меняется для разработчика приложения в посте от Mohamed Said (Laravel core), а также тут.
- thedevdojo/wave — Скелет для создания SааS на базе Laravel: профили пользователей, подписки, API, админка, блог.
- Как Christoph Rumpel тестирует компоненты Livewire.
- Event Sourcing in Laravel — Платный курс от ребяток из Spatie. Есть бесплатный кусок для ознакомления. Также есть часовое вводное видео.
- Стрим по созданию пакет для Laravel с нуля на примере laravel-signal-aware-command.
- Laravel Worldwide Meetup #8
Async PHP
- reactphp/http v1.3.0 — HTTP клиент и сервер ReactPHP теперь с поддержкой keep-alive соединений и x2 улучшенной производительностью.
- WordPress-PSR/swoole — Интересная и даже рабочая попытка запустить WordPress на Swoole.
- Мифы об асинхронном PHP: он не по-настоящему асинхронный.
PhpStorm
- PhpStorm 2021.1 — Подробный разбор всех новых фич в релизе.
- Используем Live Template'ы в PhpStorm для полей Doctrine
- Как быстро просмотривать логи Symfony в PhpStorm с помощью Ideolog.
Тестирование
- Не мокайте то, чем вы не владеете
- Работа с частичными моками в PHPUnit 10
- Практики при работе с PHPUnit
- Так как же не страдать от функциональных тестов?
- Юнит-тестирование на PHP в примерах
Статьи
- Обновляем проект на PHP 8.0.
- Named-entity recognition на PHP — Пример решения простой ML-задачи с помощью RubixML.
- Как получить и исследовать опкоды PHP.
- Серия постов об использовании монорепозитория в PHP проектах.
- Escape-последовательности и числовые нотации в PHP.
- Ты приходишь в проект, а там легаси… — Что можно быстро предпринять, чтобы облегчить страдания.
- Осмысленные интерфейсы.
Аудио/Видео
- Подкаст «Между скобок» №14 — Александр Макаров про кровавый open source.
- Митап нижегородского PHP-сообщества
- Митап «Безопасность веб-приложений на PHP»
- Modern PHP with Rasmus Lerdorf — Создатель PHP рассказывает немного про код в Etsy и про PHP 8.
- Xdebug 3 с Docker и PhpStorm за 5 минут — Инструкция от автора Xdebug.
- PHP Internals News podcast #82 — Про многострочные короткие замыкания с автозахватом скоупа (RFC) с Larry Garfield и Nuno Maduro.
- PHP Internals News podcast #79 — Про
оператор new
в инициализаторах с Никитой Поповым. - PHP Release Radar #8 — С Nuno Maduro про Pest.
- PHP Release Radar #9 — С Andreas Braun про Doctrine Cache 2.0.
Из-за проблем со здоровьем стримы пока на паузе.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Подписывайтесь на Telegram-канал PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 201