Фото James Titcumb
Свежая подборка со ссылками на новости и материалы. В выпуске все про PHP 8: первая альфа, новое выражение match
, баг в синтаксисе @@
для атрибутов, реальные бенчмарки JIT, 4 новых предложения. И, как всегда, инструменты, статьи, видео и подкасты.
Приятного чтения!
Новости и релизы
- PHP 8.0 alpha 1 — Вышла первая альфа-версия новой ветки PHP! Впереди полугодовой цикл тестирования с финальным выпуском в конце ноября.
Основные новые возможности:- объединенные типы;
- JIT;
- атрибуты;
- объявление свойств в конструкторе;
- новый тип mixed.
Полные обзоры что нового в PHP 8 тут и тут.
Пощупать можно на 3v4l.org или используя уже готовые Docker-образы. - `CurlHandle` class objects replace curl handlers — Еще, одной из долгосрочных целей PHP является отход от использования типа resource и вместо этого переход на классы/объекты. В PHP 8 привычные функции curl_ уже переделаны и вместо ресурса оперируют объектом класса
CurlHandle
. - О производительности JIT в PHP 8 — После твита о феноменальном приросте производительности с JIT многие в сообществе засомневались в результатах бенчмарка и провели свои.
Derick Rethans показал, что JIT дает хороший прирост на коде, который поддается оптимизации, но все равно это не сравнимо с чистой реализацией на C. Brent Roose попробовал на веб-приложениях и ожидаемо прирост в них минимальный.
Benjamin Eberlei подготовил инструкцию о том, как вообще тестировать с JIT и на что обращать внимание. - Открытое собеседование — ищем участников — Вместе с Валентином Удальцовым скоро проведем собеседование в формате стрима. Прием заявок на участие заканчивается 8 июля.
PHP Internals
- [RFC] Shorter Attribute Syntax — На голосовании по новому синтаксису для атрибутов победил вариант
@@
.Позже выяснилось, что этот синтаксис может трактоваться неоднозначно, а в реализации использовался хак, чтобы обойти проблему и об этом не было упомянуто в предложении.
Двусмысленность вот такая:
function(@@X Y $z)
может быть интерпретирован какfunction(@@XY $z)
(атрибутXY
и без типа) илиfunction(@@X Y $z)
(атрибутX
иY
тип параметра). Потому что PHP допускает пробелы вокруг разделителя неймспесов.К счастью для поклонников синтаксиса
@@
, Никита нашел способ решить проблему, если будет принято предложение [RFC] Treat namespaced names as single token. - [RFC] Match expression v2 — В PHP 8 будет доступно новое выражение
match
, которое работает по смыслу какswitch
, но при этом имеет проверку на тип и возможность возвращать значение.// Вот так работает switch: switch ('foo') { case 0: $result = "Oh no!n"; break; case 'foo': $result = "This is what I expectedn"; break; } echo $result; //> Oh no! // То же самое на match: echo match ('foo') { 0 => "Oh no!n", 'foo' => "This is what I expectedn", }; //> This is what I expected
- [RFC] Allow trailing comma in closure use lists — Предлагается разрешить опциональную запятую в конце списка
use
у замыканий по аналогии с тем, как уже сделано для аргументов и параметров функций.Скрытый текст$longArgs_longVars = function ( $longArgument, $longerArgument, $muchLongerArgument, // Здесь запятая в PHP 8.0 уже разрешена ) use ( $longVar1, $longerVar2, $muchLongerVar3 // А вот здесь предлагается добавить ) { // body };
- [RFC] Property write/set visibility — В этом документе предлагается сделать возможным указание двух модификаторов доступа для свойств: отдельно на чтение и запись. И есть два варианта синтаксиса:
// Syntax Option A class User { public:private int $id; public:protected string $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } } // Syntax Option B class User { public private(set) int $id; public protected(set) string $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } }
Судя по треду, что-то подобное будет, но уже в PHP 8.1, потому что требуется больше времени для обсуждения нюансов и пересечений с другими RFC, например, полноценными аксессорами, ридонли свойствами, иммутабельными классами.
- [RFC] Language Constructs Syntax Changes — Поскольку
declare
и__halt_compiler
— это не функции, а языковые конструкции, по типу какecho
, то предлагается разрешить вызывать их без скобок.declare(strict_types=1); // => declare strict_types = 1;
- [RFC] Saner numeric strings — В этом RFC предлагается сделать два изменения по части обработки строк с числами.
Во-первых, избавиться от концепции «строки, начинающейся с цифр». Например в таком случае
echo '2str' + 2;
результат будет не 4, а 2 и вместоE_NOTICE “A non well formed numeric value encountered”
будет брошенE_WARNING “A non-numeric value encountered”
.И во-вторых, разрешить пробельные символы в конце числовых строк, то есть чтоб
"123 " == " 123"
былоtrue
и все прочие операции работали, как и для строк с начальными пробелами.
Инструменты
- Guzzle 7 — Свежий релиз самого известного HTTP-клиента для PHP. Теперь клиент реализует стандарт PSR-18, минимальная версия PHP 7.2, добавлены тайпхинты.
- deligoez/xDebug-Toggler — Приложение для macOS для быстрого включения/выключения Xdebug.
- denisyukphp/tmpfile-manager — Менеджер временных файлов. Умеет закрывать ресурсы, автоматически или вручную очищать временные файлы, запускать свой сборщик мусора. Прислал @jebox.
- php-aidc/label-printer — Библиотека для работы с принтерами этикеток с поддержкой языков Fingerprint, Direct Protocol, TSPL/TSPL2. Прислал jhaoda.
Symfony
- EasyAdmin 3 — Обновление генератора админок для Symfony-приложений.
- ferrius/ddd-cqrs-example — Пример реализации принципов CQRS, DDD, ADR и гексагональной архитектуры на Symfony 5 и PHP 7.4.
- Неделя Symfony #705 (29 июня — 5 июля 2020)
- 10 советов по тестированию в Symfony.
- [Symfony 5] Раздельная авторизация для админов и пользователей с двумя разными сущностями и формами входа.
- Простое управление ACL в Symfony.
Laravel
- Laravel Worldwide Meetup — Первый выпуск онлайн-митапа Laravel пройдет 14 июля в 21:00 UTC+3.
- Laravel Idea 3.1 — В новой версии плагина дла PhpStorm добавлена поддержка Livewire и nWidart/laravel-modules.
- scil/LaravelFly — Пакет позволяет запускать Laravel на Swoole. Автор заверяет, что можно запускать один и тот же код и на PHP-FPM и на Swoole. Есть сравнение с другими подобными реализациями.
- Решение проблемы N+1 запроса без увеличения потребления памяти в Laravel.
- Laravel-Дайджест (29 июня – 5 июля 2020)
- Отличный совет от Тейлора применим не только к Laravel:
Async PHP
- amphp/websocket-server 2.0 — Вебсокет сервер на базе Amp.
- clue/reactphp-buzz — Простой в использовании асинхронный HTTP-клиент.
Материалы для обучения
- Путешествие в поисках утечки памяти — Как и где можно искать утечки, когда
memory_get_usage()
ничего не показывает. - Как использовать PHP FFI в программировании.
- 0xbigshaq/php7-internals — Репозиторий с подборкой уязвимостей в PHP, объяснением почему так происходит и как они эксплуатируются.
- Как будет выглядеть программирование в 2025?
- Что делает max_execution_time?
- Настраиваем Xdebug и PhpStorm для Symfony.
- Дебажим PHP-контейнер с помощью Xdebug и PhpStorm.
- Как быть, когда все советуют растащить проект на микросервисы, а ты не готов.
- Если вы используете моки, то вы хоть что-то тестируете?
Аудио/Видео
- Настройка отладки с Xdebug, PhpStorm и Laravel в Docker — От автора Xdebug Derick Rethans.
- Видео Пятиминутка PHP: Про PhpStorm на macOS Metal.
- Видео Пятиминутка PHP: 25 лет PHP — история развития в наглядной инфографике.
- Несколько видео с PHP fwdays 2020
- Как готовить код-ревью: обсуждаем плохие и хорошие практики с Константином Буркалевым, Антоном Моревым, Сергеем Жуком и Александром Макаровым.
- MoreView #11 — Интервью со мной про дайджесты, PHP, JetBrains.
- Интервью Александром Макаровым про OpenSource, Yii 3 и всякое.
- Serverless Chats Podcast #55 — C Mathew Napoli автором Bref о серверлесс PHP.
- PHP Internals News #60 — C Eliot Lear о поддержке новых криптографических функций согласно RFC-5652 в PHP 8.
- PHP Internals News #59 — C Никитой Поповым об именованных параметрах, которые он в скором времени планирует выставить на голосование для PHP 8.
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 182
Автор: Роман Пронский