Фото: Иван Ганцев.
Подборка свежих новостей и материалов из мира PHP. Вышел первый релиз-кандидат PHP 8.1, в Packagist обнаружено два зловредных пакета, а репозиторий популярного пакета AliceBundle пропал с GitHub. Для PHP 8.2 предложены два новых RFC: про
Приятного чтения!
Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.
Подборка свежих новостей и материалов из мира PHP. Вышел первый релиз-кандидат PHP 8.1, в Packagist обнаружено два зловредных пакета, а репозиторий популярного пакета AliceBundle пропал с GitHub. Для PHP 8.2 предложены два новых RFC: про
$this
в качестве тайпхинта для возвращаемых значений, и про удаление старых видов колбэков. Также в выпуске порция полезных инструментов, статьи и видео.Приятного чтения!
Новости
PHP 8.1.0 RC 1
До финального релиза еще два с половиной месяца и как минимум 5 релиз-кандидатов. Подготовка идет полным ходом, и многие крупные open-source проекты работают над совместимостью.
Вот микро-инструкция по установке PHP 8.1 на macOS через brew. Есть готовые Docker-образы с PHP 8.1.
Несколько свежих материалов:
Наиболее подробно про то, что будет в PHP 8.1, можно посмотреть на php.watch/versions/8.1 и в блоге у Брента stitcher.io/blog/new-in-php-81.
Вредоносные пакеты Composer
На Packagist был пакетsymfont/process
, который при установке делал все то же самое, что иsymfony/process
, но только еще отправлял информацию о машине третьей стороне и открывал веб-шелл.
Расчет был на то, что можно опечататься и написатьsymfont
вместоsymfony
при установке.
Вредоносный пакет уже удалили и с пакаджиста и с гитхаба, но остался подробный разбор малвари.
Еще один бэкдор был обнаружен в пакетеlaraveli/qr-code
. Как видно из кода, малварь копировала на машину вот такой вебшел.
Будьте внимательны при установке composer-пакетов! Чтобы защититься от подобных проблем, стоит как минимум добавить в свой CI-пайплайн запуск local-php-security-checker или готовый GitHub Action the-php-security-checker. Для более сложных случаев можно добавить запуск сканера marcocesarato/PHP-Antimalware-Scanner.
Пропал hautelook/alice-bundle
Репозиторий пакета hautelook/alice-bundle удален с Гитхаба. У пакета 8 млн загрузок и главный контрибьютор не в курсе почему его удалили из списка мейнтейнеров, а репозиторий, по-видимому, сделали приватным.
Рабочий форк доступен на Гитхабе у автора: theofidry/AliceBundle.
PHP Internals
[RFC] $this return type
Никита выдвинул на обсуждение идею использовать$this
как тип возвращаемого значения. При этом интерпретатор проверит, что возвращается именно тот же самый объект.
То есть если сравнивать сself
иstatic
:
self
— возвращаемое значение должно быть экземпляром класса, который задает данный тип;static
— возвращаемое значение должно быть экземпляром класса, который вызывает метод с данным объявлением типа;$this
— возвращаемое значение должно быть тем же экземпляром, что и экземпляр, который вызывает метод с данным объявлением типа.
class Test { public function method(): $this { return $this; } public function not_this(): $this { return new self(); // Fatal Error } }
[RFC] Deprecate partially supported callables
Сейчас есть несколько способов описать колбэк функцию, которые пройдут проверку на типcallable
, через вызовis_callable()
и в качестве аргументаcall_user_func()
. Но при этом вызвать их как обычную анонимную функцию$callable()
не получится.
Предлагается задепрекейтить такие не консистентные варианты:
"self::method" "parent::method" "static::method" ["self", "method"] ["parent", "method"] ["static", "method"] ["Foo", "Bar::method"] [new Foo, "Bar::method"]
Нормальные вызовы вида"function"
,"Foo::method"
,["Foo", "method"]
и[new Foo, "method"]
не затронуты этим предложением. Потому что для них вызов через скобки сработает:
class Foo { function method() { echo 'method'; } } [new Foo, "method"](); // > method
Alias stdClass to DynamicObject?
В контексте удаления динамических (несуществующих) свойств появилась идея переименовать классstdClass
вDynamicObject
(сделать алиас). Потому что так его предназначение будет понятно из названия.
Все RFC на GitHub
В качестве эксперимента Ben Ramsey, релиз-менеджер PHP 8.1, экспортировал в Git все (838) когда-либо обсуждавшиеся RFC, включая историю изменений для каждого RFC.
Инструменты
- phabelio/phabel — Транспайлер для PHP. Позволяет использовать фичи из последних версий PHP в более старых окружениях или когда нужно поддерживать обратную совместимость. Также можно делать поддержку несуществующих фич, например, ключевых слов
async/await
.
Подобные инструменты уже были раньше, например marcioAlmada/yay или preprocess.io. А делать бэкпорты умеет и Rector. Но фишка Phabel в прозрачной интеграции сСomposer
.
- VKCOM/noverify — Быстрый статический анализатор и линтер для PHP-проектов реализованный на Go. Добавлена поддержка PHP 8 и теперь его можно поставить через Composer.
- koriym/Koriym.Attributes — Простой инструмент позволяет читать PHPDoc аннотации doctrine/annotations и атрибуты PHP 8 через единый интерфейс. Для тех же задач есть более продвинутый spiral/attributes.
- niklongstone/regex-reverse — Генерирует случайную строку, которая удовлетворяет заданному регулярному выражению.
- Innmind/Immutable — Довольно интересная иммутабельная реализация примитивов: Sequence, Set, Map, Str, RegExp.
- grep.app — Удобный инструмент для быстрого поиска кода по Гитхабу.
Symfony
- Полное руководство по компонентам Symfony — Когда и какие стоит использовать в своих проектах. Прислал Askew.
- Как динамически проверить некоторые данные с помощью Symfony Validator.
- Хелперы для тестирования ваших приложений на компонентах Symfony: zenstruck/mailer-test, zenstruck/console-test, zenstruck/messenger-test, zenstruck/browser.
- lexik/LexikTranslationBundle — Позволяет импортировать переводы в базу и предоставляет интерфейс для их удобного редактирования. Прислал @dmitrybalabka.
- В Symfony плагине для PhpStorm добавлена поддержка PHP 8 атрибутов для метаданных Doctrine:
Laravel
- lepikhinb/laravel-fluent — Позволяет явно декларировать аттрибуты Eloquent-моделей как свойства класса, в том числе связи. А также позволяет приводить типы с помощью аннотаций, вместо определения в
$castAttributes
. Благодаря этому модели выглядят чище и не требуют генерации PHPDoc для подсказок от IDE. - Локализация Laravel nova или как сломать себе мозг от желаний заказчика.
- Как тестировать формы в Laravel.
- Про фоновые задачи в Laravel с помощью компонента Queue — Продолжение серии видео про фреймворк для тех, кто только начинает.
- Создание приложения Laravel с нуля — Классный стрим от Mohamed Said, core Laravel, где он пишет приложение и комментирует свои шаги.
- PHP Roundtable: 10 лет Laravel с Taylor Otwell, Matt Stauffer и Eric Barnes.
- Обзор конференции недавно прошедшей Laracon: Часть 1 Часть 2.
Yii
- machour/yii2-web-push-notifications — Модуль для Web Push Уведомлений.
- mhthnz/yii2-tarantool — Коннектор позволяет использовать абстракции фреймворка TableSchema, ActiveRecord, ActiveQuery и т.п. с базой Tarantool.
Статьи
- Несколько полезных техник для тестирования с помощью PHPUnit от Larry Garfield.
- Совет по тестированию от Matthias Noback: Самодостаточные тесты.
- Re: On using PSR Abstraction Ответ на упомянутую в прошлом выпуске статью Matthias Noback про использование PSR.
- Как ускорить приложение за счёт PHP-FPM (няшим FPM conf)
- Все про выражение match из PHP 8.0 — А вы знали, что можно делать вот так:
// Pseudo-data that you might receive from the front-end. $options = [ 'monthly', 'credit-card', ]; return match ($options) { ['monthly', 'direct-debit'] => $this->setupDirectDebit(), ['yearly', 'credit-card'] => $this->takeYearlyCardPayment(), ['monthly', 'credit-card'] => $this->setupCardSubscription(), };
- Шутка и баг, конечно, но все же :-)
От версии к версии мы собираемся случайным образом изменять некоторые константы в PHP, чтобы никто не полагался на захардкоженые значения.
Подписывайтесь на Telegram-канал PHP Digest.
Этот дайджест подготовлен совместно с Insolita. Если вам понравился выпуск, поставьте, пожалуйста, ему плюс.
Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.
Прислать ссылку можно через форму или просто написав мне в телеграм.
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 210