Фото James Titcumb
Свежая подборка со ссылками на новости и материалы. В выпуске все про PHP 8: первая альфа, новое выражение
Приятного чтения!
Свежая подборка со ссылками на новости и материалы. В выпуске все про 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(@@X\Y $z)
(атрибутX\Y
и без типа) или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 expected\n"; break; } echo $result; //> Oh no! // То же самое на match: echo match ('foo') { 0 => "Oh no!\n", 'foo' => "This is what I expected\n", }; //> 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; } // Syntax Option B class User { public private(set) int $id; public protected(set) string $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
JTG
Ну что за дичь опять?
a_mazur
Что-то похожее есть в C#, но у него куда более элегантный вид:
Как по мне — изменения в целом стоящее, но не в этом вот виде, который предлагается.
pronskiy Автор
Такой вариант как раз предлагался https://wiki.php.net/rfc/propertygetsetsyntax-v1.2, но не прошел голосование на тот момент.
JTG
В питоне так
или декоратором
«private public» это что-то за гранью.
quantum
Странно сравнивать с пайтоном, учитывая то, что в нем все свойства/методы публичные
galliard
Так и в php щас можно
VolCh
Это не совсем то. Каждое свойство отдельно не описывается
galliard
Можно ифы внутри магических методов написать. Но да, выглядеть это будет по уродски.
VolCh
А как в шарпе сделать протектед на чтение и приват на запись?
Taraflex
dotnetfiddle.net/1orqXf
VolCh
Нормально так, понятно
Alroniks
Тоже подгорает от такого. Сначала атрибуты абы как сделали, но ладно, на практике еще не использовали, но это за гранью уже. Чем им readonly properties не угодили? Тоже самое ж, читать читай, писать нельзя.
pronskiy Автор
Ридонли возможно будут в виде атрибута https://wiki.php.net/rfc/readonly_and_immutable_properties (ранний черновик)
pOmelchenko
Жаль что ссылаются на шарп, а делают через атрибуты.
почему не сделать так же?!
Чтобы в конечном итоге иметь возможность работать в таком виде:
И с классами так же
balloon
А мне самая идея показалось толковой. Не придется делать какие-то левые свойства вроде $_id или геттеры/сеттеры, если ты хочешь менять свойство только внутри класса, но при этом сделать его public на чтение. В типичной entity таких полей будет большинство.
arkamax
Я за то, чтобы добавить гет/сет, это удобно, но синтаксис в таком виде — это ИМХО адъ.