Свежая подборка со ссылками на новости и материалы. В выпуске: 3 принятых и 6 новых RFC-предложений из PHP Internals, включая голосование за новый синтаксис для атрибутов — @@
и почему #[]
был бы лучше, переименования black/whitelist в PHP-мире, как отлаживают PHP-разработчики, аналог ngrok на PHP, видео, подкасты и многое другое.
Приятного чтения!
Новости и релизы
- PHP исполнилось 25 лет — Таймлайн с основными событиями в истории языка.
- PHP 7.4.7 — Кроме прочего, в этом обновлении исправлена
ошибка yield from
. - PHP 7.3.19
- Composer 2.0.0-alpha1
- The State of Developer Ecosystem in 2020 — PHP-секция из опроса разработчиков от JetBrains.
65% опрошенных указали, что для отладки пользуются подходом
dump & die
, поэтому провокационный твит автора Xdebug ожидаемо вызвал бурную реакцию в сообществе:
PHP Internals
- [RFC] Attribute Amendments — Приняты дополнения к атрибутам: возможность группировать
<<Attr1, Attr2>>
,PhpAttribute
переименован вAttribute
, валидация и возможность добавлять несколько одинаковых атрибутов. - [RFC] Ensure correct signatures of magic methods — Сигнатуры магических методов в PHP 8 будут валидироваться. Например, сейчас можно объявить в классе вот такой магический метод:
Скрытый текст
class Foo { function __get(int $name): void { echo $name; } } (new Foo)->{42};
В PHP 8 это вызовет ошибку на этапе компиляции.
- [RFC] Make sorting stable — Все стандартные функции сортировки в PHP (sort, usort, asort и т.д.) начиная с PHP 8.0 будут стабильными. Это значит, что гарантируется оригинальный порядок элементов с одинаковыми значениями. В текущих версиях легко найти примеры, когда это не так.
- [RFC] Opcache optimization without any caching — Отклонено предложение по выполнению оптимизаций без кеширования опкодов.
- [RFC] Make constructors and destructors return void — Сейчас в PHP можно возвращать любые значения из конструкторов и деструкторов, например:
Скрытый текст
class Test { public function __construct() { return 0; } public function __destruct() { return 1; } } $test = new Test(); // this prints 0 echo $test->__construct(); // this prints 1 echo $test->__destruct();
Предлагается в PHP 8.0 бросать
Deprecated
предупреждение в таких случаях. А уже в PHP 9.0 запретить полностью и генерироватьFatal Error
. - [RFC] Treat namespaced names as single token — Из-за того, что каждый элемент неймспейса рассматривается интерпретатором как отдельный токен, внутри неймспейса не может быть ключевого слова. Например,
namespace appfunction { class Foo {} };
свалится с ошибкойParse error
. Предлагается считать токеном весь неймспейс — это позволит минимизировать проблемы обратной совместимости при введении новых ключевых слов. - [RFC] Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON — Токен
::
в PHP называетсяT_PAAMAYIM_NEKUDOTAYIM
— этот факт даже был обозначен как проблема № 1 в списке грустей PHP.
Автор предлагает переименовать токен. Смысла в этом нет, потому что в сообщениях об ошибке итак выводится::
, а с таким названием он и гуглится идеально. - [RFC] Shorter Attribute Syntax — Аттрибуты уже были приняты для PHP 8, но синтаксис многим не по душе. На голосование выставлено три варианта:
<<Attr>>
(текущий) vs@@Attr
vs#[Attr]
. Brent Roоse привел несколько убедительных аргументов в пользу#[ ]
:- Такой же синтаксис в Rust.
- Он обратно совместим:
#[Attribute]
просто проигнорируется интерпретатором PHP <=7.4 как комментарий. @@
можно спутать с оператором подавления ошибок (пример).<<>>
тоже не очень, потому что можно спутать с битовыми операторами и в будущем с дженериками, которые вероятно будут использовать одинарные угловые скобки<>
.
- [RFC] Change terminology to ExcludeList — Тема переименования потенциально неполиткорректных терминов не обошла стороной и PHP-мир. В Internals были горячие обсуждения.
В ядре PHP изменение только в одном месте: директиву конфигурации опкешаopcache.blacklist_filename
предлагается заменить наopcache.exclude_list_filename
.
В других PHP-инструментах соответствующие изменения уже внесли: PHPUnit, Drupal, Xdebug, Yii, Composer (+ работа с не-master Git-ветками). Также сделали правила для PHP_CodeSniffer для поиска «плохих» слов. - [RFC] Nullsafe operator — Вместо пачки вложенных условий предлагается добавить возможность обращения к свойству или методу с проверкой на
null
:$country = $session?->user?->getAddress()?->country;
Вместо$country = null; if ($session !== null) { $user = $session->user; if ($user !== null) { $address = $user->getAddress(); if ($address !== null) { $country = $address->country; } } }
- Обновлено расписание PHP 8.0 — Заморозка новых фич сдвинута на 4 августа, а финальный релиз назначен на 26 ноября.
- Пощупать PHP 8 можно на известном ресурсе 3v4l.org. Для этого достаточно посмотреть результат запуска в ветке php-master.
Инструменты
- beyondcode/expose — Сервис туннелирования на чистом PHP. Аналог ngrok. Подробнее было в канале PHP Digest.
- canvural/php-openapi-faker — Библиотека для генерации тестовых данных для OpenAPI запросов/ответов/схем.
- doctrine/migrations 3.0.0 — Мажорное обновление инструмента для миграций.
- mathiasverraes/uptodocs — Маленький инструмент, который находит блоки PHP-кода в Markdown-файлах и запускает их для поиска падающих.
Symfony
- Доступна сертификация по Symfony 5.
- В Symfony 6 для конфигов будут использоваться PHP-файлы вместо YAML или XML.
- dbu/snake-bundle — Игра змейка, реализованная на symfony/console.
- Какой прирост производительности ожидать от приложения на Symfony 5 с предзагрузкой опкеша?
- 10 советов по тестированию Symfony.
- Защита Symfony-приложений от Top 10 OWASP уязвимостей.
- Неделя Symfony #703 (15-21 июня 2020)
Laravel
- spatie/laravel-cronless-schedule — Пакет для выполнения задач по расписанию без использования cron. Под капотом ReactPHP и таймеры. Интро.
- Добавляем try/catch в коллекции Laravel
- Laravel-Дайджест (15–21 июня 2020)
- Статистика пакетов экосистемы Laravel
- Большой тред с советами по написанию Laravel-приложений:
Yii
Laminas
- Мертв ли Zend Framework? — На этот и другие вопросы отвечает лидер проекта Laminas — Matthew Weier O'Phinney.
- asgrim/mini-mezzio — Быстрое создание приложения на Mezzio (экс Zend Expressive).
Async PHP
- badfarm/zanzara — Асинхронный фреймворк для создания Telegram-ботов на базе ReactPHP.
- simple-swoole/simps — Еще один фреймворк на базе Swoole. Судя по бенчмаркам самый быстрый из PHP.
- Видеокурс по ReactPHP от Marcel Pociot
Материалы для обучения
- Представляем новый серверлесс LAMP стек — Пост в блоге AWS об использовании PHP и подборка ресурсов по теме.
Также для PhpStorm теперь доступен официальный плагин AWS Toolkit от Amazon. - Об объявлении свойств в конструкторе в PHP 8.
- Какие функции PHP наиболее часто используются во фреймворках? — В Symfony это
sprintf()
, в Laravel —is_null()
. Автор предоставил инструкцию, как подсчитать для других фреймворков. - О финальных классах в PHP.
- Миллион за месяц: как запустить стартап в Европе своими силами.
- Redis на практических примерах.
- Беги, PHPUnit, беги: как я оптимизировал время выполнения тестов.
- Самый быстрый шаблонизатор для PHP.
Аудио/Видео
- Видеозаписи всех докладов с PHP Russia 2020 Online
- Макс Рафалко, Принципы проектирования пакетов PHP
- Стрим Пятиминутка PHP по Laravel Livewire: сетевая игра (часть 5)
- Между скобок № 9: Александр Лисаченко — АОП в PHP.
- PHP Internals News #58 — C Max Semenik о принятом RFC non-capturing catches.
- PHP Internals News #57 — C Ralph Schindler о его предложении добавить
return if ($condition): $returnValue;
. - PHP Internals News #56 — С Dan Ackroyd о добавленном псевдотипе mixed.
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 181
Автор: Роман Пронский