Свежая подборка со ссылками на новости и материалы. В выпуске: PHPUnit 9 и другие релизы, 3 свежих RFC предложения из PHP Internals, порция полезных инструментов, видео, подкасты и многое другое.
Приятного чтения!
Новости и релизы
- Developer Ecosystem Survey 2020 — Опрос разработчиков от JetBrains. Раздел PHP обновили. В нём также есть вопросы относительно направления развития PHP, результаты которых будут обсуждаться на встрече PHP Internals.
- Ближайшие мероприятия:
• Москва, 15 февраля: Badoo PHP Meetup #4. Легаси
• Воронеж, 17 февраля: Первая встреча PHP-чата (с докладами)
• Санкт-Петербург, 28 февраля: SymCode-митап, TBA
• Ростов-на-Дону, 29 февраля: 3-й PHP-митап городского чата
• PHP Russia 2020 — К уже подтверждённым докладчикам добавился Nicolas Grekas. Для читателей дайджест есть промокод со скидкой 7%: PHPDIGEST.
• skyeng/php-communities — Открытый список PHP-событий, спикеров и организаторов.
PHP Internals
- [RFC] Allow function calls in constant expressions — Сейчас в объявлениях констант можно использовать только литералы, константы и операции. В этом RFC предполагается добавить возможность вызова глобальных функций (всех или подмножество) в объявлениях констант, значений по умолчанию статических свойств, статических переменных и значений по умолчанию параметров. Скрытый текст
class MyClass { const VALUES = [1, 0]; const C1 = count(self::VALUES); public static $p = count(self::VALUES); public function foo($param = count(self::VALUES)) { static $bar = count(self::VALUES); } }
- [RFC] __toArray() — Предлагается добавить новый магический метод
__toArray()
, который будет вызываться при явном приведении объекта к массиву, когда объект передаётся в качестве параметра функции с типом array или когда возвращается с указанием return type array.Скрытый текстclass Person { protected $name; protected $email; public function __toArray() { return [ 'name' => $this->name, 'email' => $this->email, ]; } } $person = new Person('John Doe', 'j.doe@example.com'); $personArray = (array) $person; // вызывает __toArray() function foo(array $person) { var_dump($person); // Здесь массив } function bar(Person $person): array { return $person; } var_dump(bar($person)); // и здесь массив
- [RFC] Userspace operator overloading — Рассматривается возможность реализовать перегрузку операторов в PHP. Предложение пока в статусе черновика, но активно обсуждается в Internals. А тем временем перегрузку операторов можно использовать в PHP 7.4 на основе lisachenko/z-engine.
- [RFC] Validation for abstract trait methods — Сигнатуры абстрактных методов из трейтов не валидируются на соответствие реализации. То есть вот такой код сейчас работает без ошибок: Скрытый текст
trait T { abstract public function test(int $x); } class C { use T; // Работает сейчас, но не должно из-за несоответствия типов public function test(string $x) {} }
Предлагается исправить это поведение.
Ранее было опубликовано в виде пул-реквеста, но присутствует обратная несовместимость, которая требует пройти через RFC-процесс: если в текущем коде объявлен реализован абстрактный метод из трейта с другой сигнатурой, то изменение вызовет ошибку. - Предложения на голосовании: Static return type, Variable Syntax Tweaks, Allow ::class on objects, declare(function_and_const_lookup='global')
- Дженерики в PHP — Никита Попов опубликовал результаты исследования возможности реализации дженериков в PHP.
- php/doc-en — Документацию PHP на английском теперь можно редактировать через пул-реквесты на GitHub вместо старого редактора edit.php.net.
Инструменты
- PHPUnit 9 — Требует PHP 7.3+ и использует больше современных фишек PHP, а также содержит ряд обратно несовместимых изменений. Подробнее в инструкции по апгрейду.
- php-ai/php-ml — Библиотека для машинного обучения на PHP. Документация на русском.
- salsify/jsonstreamingparser — Потоковый парсер JSON для работы с большими файлами. Прислал @IssecMura.
- spatie/docker — Микрообёртка для запуска контейнеров и выполнения команд из PHP.
- kitetail/zttp — HTTP-клиент (обёртка над Guzzle) с простым интерфейсом для типичных задач.
- lisachenko/immutable-object — Реализация неизменяемых (Immutable) объектов на основе lisachenko/z-engine требует PHP 7.4 и FFI.
- symfony/polyfill-php80 — Полифил PHP 8.0.
- paratestphp/paratest — Пакет для распараллеливания тестов PHPUnit. Совместим с PHPUnit 9.
Symfony
Laravel
- haruncpi/laravel-log-reader — Пакет для красивого отображения логов в админке.
- calebporzio/sushi — Позволяет описать набор данных (строк таблицы) прямо в виде массива в свойстве модели и потом использовать, как если бы это были данные из базы. (Под капотом создаёт SQLite).
- Использование примесей (mixin) в Laravel
- Laravel больше чем CRUD: 09. О тестовых фабриках.
- Подкаст Тейлора: Laravel Snippet #22 — О Laracon Online, Inertia.js, Livewire, SPAs и др.
- CLI интерфейс для Laravel Artisan
- Книга «Архитектура сложных веб-приложений. С примерами на Laravel».
Async PHP
- Сергей Жук беседует с Marc Morera — автором (DriftPHP) об асинхронном PHP.
- driftphp/awesome-reactphp — Подборка полезных ресурсов и инструментов по ReactPHP.
Материалы для обучения
- Новое в PHP 8
- Type matching in PHP — Реализация аналога конструкции match из Rust на PHP с помощью стрелочных функций.
- Enums without enums in PHP — Идея имитации перечислимого типа с помощью анонимных классов.
- О том как писать PHPDoc для массивов — В PhpStorm можно использовать плагин deep-assoc-completion.
- Об аспектно-ориентированном программировании в PHP с использованием Go!AOP.
- Redux в 30 строк на PHP
- Были опубликованы эксплоиты, которые используют уязвимость в обработке ini-опции disable_functions. Доступен интересный разбор этого класса уязвимостей.
- Разработка приложений и Blue-Green deployment опираясь на методологию The Twelve-Factor App с примерами на php и docker.
- Работа с IPv6 в PHP
- Железо или оптимизация? Badoo, Авито и Мамба — о производительности PHP
- Эволюция обработки вебхуков Facebook: с нуля до 25 000 в секунду
Аудио/Видео
- Большой видеокурс по Event Sourcing
- О снэпшот-тестирования с PHPUnit — и spatie/phpunit-snapshot-assertions.
- Видеозаписи PHPKonf 2019 — Интересный доклад Midori Kocak о том, как предложить свою идею для PHP чтоб её приняли.
- The Undercover ElePHPant #7 — С автором monolog Jordi Boggiano о логировании в продакшене и в целом о лучших практиках логирования.
- PHP Internals News #38 — О предзагрузке и WeakMaps с Никитой Поповым. (Теперь с текстовой расшифровкой).
- PHP Internals News #39 — Об интерфейсе Stringable с Nicolas Grekas, который, кстати, будет на PHP Russia в этом году.
Занимательное
- bragful/ephp — Интерпретатор PHP на чистом Erlang.
- Xdebug cloud — На конференции SunshinePHP (на 47:45) Derick Rethans рассказал о новом проекте, цель которого упростить настройку Xdebug, особенно в случаях, когда могут быть трудности с сетью (Docker, удалённый сервер и тп). По сути – прокси.
- PhpQuiz — Telegram-канал, на котором публикуются задачи по PHP, архитектуре, PSR-стандартам и фреймворкам.
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Telegram-канал: PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 172
vdem
Это предлагалось давным-давно, но были какие-то проблемы. Вот нашел на stackoverflow:
ReDev1L
Ну я проблемы не увидел, увидел только что человеку легче говнокодить или юзать либы/фреймворки, чем принять и запомнить, что у него есть прекрасный метод который можно задефайнить и всё будет чики-пуки.
sonkei
Чем не угодил ArrayAccess ? Зачем плодить одно и то же?
LastDragon
Оно скорее аналог
JsonSerializable
ReDev1L
Надо имплементить интерфейс и 4 метода. И ArrayAccess всё таки немного другое.