Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Свежая подборка со ссылками на новости и материалы. В выпуске: 5 новых RFC из PHP Internals, а также предложение по развитию языка и пара прототипов новых фич в виде пул-реквестов, порция полезных инструментов, видео, подкасты и многое другое.
Приятного чтения!
Новости и релизы
- PHP 7.4.3 — На этот раз всё-таки исправили ошибки с использованием
opcache.preload_user
и теперь предзагрузку можно включать в продакшене. - PHP 7.3.15
- PHP 7.2.28
- Ближайшие мероприятия:
• Санкт-Петербург, 28 февраля: SymCode-митап, TBA
• Ростов-на-Дону, 29 февраля: 3-й PHP-митап городского чата
• Ярославль, 12 марта: BeerPHP
• Нижний Новгород, 14 марта: 3-й PHP-митап городского чата
• Екатеринбург, 26 марта: 3-й PHP-митап
• Казань, 28 марта: 2-й PHP-митап
• skyeng/php-communities — Открытый список PHP-событий, спикеров и организаторов.
• PHP fwdays'20, Киев, 30 мая — В этом году среди докладчиков тот самый Никита Попов! Для читателей дайджеста есть промокод со скидкой 15%: PHPDIGEST2020.
PHP Internals
- Language evolution — Предложение Никиты о том, как продолжать двигать PHP вперед, не ломая легаси код. Подробнее в канале дайджеста, и обсуждение в пул-реквесте.
- Приняты: [RFC] Variable Syntax Tweaks, [RFC] Static return type, [RFC] Allow ::class on objects
- [RFC] Write-Once Properties — Предлагается добавить новый модификатор для свойств, который позволит инициализировать свойства, но запретить их изменение. Открытым остаётся вопрос названия модификатора, из вариантов:
final
,immutable
,readonly
,writeonce
,locked
,sealed
.Скрытый текстclass Foo { <keyword> public int $a = 1; <keyword> public string $b; <keyword> public array $c = ["foo"]; <keyword> public object $d; public function __construct() { $this->b = "foo"; } } $foo = new Foo(); $foo->a = 42; // EXCEPTION: property a has already been initialized $foo->b = "bar"; // EXCEPTION: property b has already been initialized $foo->a++; // EXCEPTION: incrementing/decrementing is forbidden unset($foo->c); // EXCEPTION: unsetting is forbidden $foo->c[] = "bar"; // EXCEPTION: arrays can't be modified $var= &$this->c; // EXCEPTION: reference isn't allowed $foo->d = new Foo(); // SUCCESS: property d hasn't been initialized before $foo->d->foo = "foo"; // SUCCESS: objects are still mutable internally
У предложения неплохие шансы. Вероятно, для таких свойств будет запрещено установление значения по умолчанию, поскольку, по сути, это то же самое, что константа класса. - [RFC] str_contains — Предлагается добавить функцию
str_contains(string $haystack , string $needle) :bool
, которая проверяет, содержится ли строка в другой строке вместо использованияstrpos()
илиstrstr()
. - [RFC] Object-based token_get_all() alternative — Предлагается добавить альтернативу для текущей функции
token_get_all()
, которая вместо микса строк и массивов возвращал бы массив объектовPhpToken
. - [RFC] get_debug_type — Ещё одна вспомогательная функция: комбинация
gettype()
иget_class()
. - [RFC] Allow explicit call-site pass-by-reference annotation — Обновлённый RFC от Никиты снова на обсуждении. Предлагается сделать возможным явное указание передачи аргументов по ссылке. Тем самым предупреждая разработчика о том, что переданная переменная изменится. В этот раз также предлагается добавить директиву, чтоб сделать режим опциональным.Скрытый текст
declare(require_explicit_send_by_ref=1); function byRef(&$ref) {...} byRef(&$var);
- [Pre-RFC] Add support for «decorator» pattern — Никита выложил прототип реализации паттерна «декоратор» для PHP. Скрытый текст
interface Foo { public function method1(int $a): void; public function method2(): int; public function method3(string $b): string; public function method4(): stdClass; // ... } class ComposedFoo implements Foo { private decorated Foo $inner; public function __construct(Foo $inner) { $this->inner = $inner; } public function method4(): stdClass { return $DO_SOMETHING_DIFFERENT_HERE; } } /* Свойство помечено как decorated, что означает, что автоматически будут добавлены методы переадресации для всех публичных методов Foo, если только они не будут явно переопределены в классе. Эти методы будут иметь полные сигнатуры, поэтому они всё равно удовлетворяют интерфейсу. */
- [PR] Use serialize_precision for printing floats in var_dump() — Данное изменение повлияет на то, как будут отображаться
float
числа при выводе черезvar_dump()
(0.1 + 0.2 === 0.30000000000000004):Скрытый текст// Было $sum = 0.1 + 0.2; var_dump($sum); // float(0.3) var_dump($sum == 0.3); // bool(false) WTF??? // Станет $sum = 0.1 + 0.2; var_dump($sum); // float(0.30000000000000004) var_dump($sum == 0.3); // bool(false) Makes sense...
Инструменты
- T-Regx/T-Regx — Библиотека с удобным интерфейсом для работы с регулярными выражениями. Прислал lex111.
- vstelmakh/url-highlight — Библиотека для подсветки ссылок в тексте. Умеет находить ссылки без протокола (использует список доменов первого уровня). Есть расширение для twig и symfony bundle.
- spiral/RoadRunner — Сервер приложений для PHP на Golang. Добавлен файл-вотчер и теперь воркеры перезагружаются автоматически.
- tightenco/overload — Простая, но интересная реализация перегрузки методов через коллекцию замыканий.
- rainbow-alex/phi — Альфа-версия парсера PHP на PHP. Альтернатива nikic/PHP-Parser, в которой предполагается решить пачку проблем парсера Никиты, связанных с сохранением пробелов и комментариев при модификации AST.
- Калькулятор настроек php-fpm
- ergebnis/environment-variables — Абстракции для работы с переменными окружения.
Symfony
- Symfony 5. Быстрый старт — Свежую книгу от Фабьена теперь можно купить в русском переводе. Все деньги с продаж книги идут на развитие Symfony.
- Неделя Symfony #686 (17-23 февраля 2020)
- Как организовать скины в Symfony
Laravel
- vladyslavstartsev/laravel-strict-coding-standard — Пара дополнительных правил для PHP_CodeSniffer для Laravel приложений.
- thomasjohnkane/slow-query-notifier — Отправит уведомление при обнаружении слишком медленных запросов. Вводный пост.
- beyondcode/laravel-server-timing — Хелпер для добавления Server-Timing заголовков, которые можно потом посмотреть на вкладке Сеть в dev tools браузера.
- nunomaduro/laravel-mojito — Простенький пакет для тестирования вьюшек.
- Основы кэширования в Laravel.
- Руководство по Очередям и Задачам: Создаём простое аналитическое приложение, Подключения и настройки, Как запустить воркеры на продакшен-сервере.
Yii
- Новости Yii 2020, выпуск 2 — Очень много обновлений в Yii 3.
Async PHP
- Сергей Жук беседует с Marc Morera (автором DriftPHP) о DBAL и ORM в ReactPHP.
- driftphp/tiny-load-balancer — Крошечный лоадбалансер на ReactPHP.
- Асинхронный PHP
Материалы для обучения
- PHPUnit: Угроза безопасности? — О том, как старые версии PHPUnit могут привести к проблемам безопасности, если vendor доступен публично.
- В какой момент PHP вызывает __destruct()?
- О битовых масках для хранения флагов в PHP.
- Чистый код на PHP — Принципы разработки ПО из книги Clean Code Роберта Мартина адаптированные для PHP.
- Использование RabbitMQ вместе с MonsterMQ часть 1
- Тест для PHP-разработчиков от Badoo — Перед прохождением можно посмотреть разбор задач прошлого теста. Оффер в Лондон за один день: как его получить и чем заняться после переезда.
Аудио/Видео
- Что делать с легаси. Материалы с Badoo PHP Meetup #4
- Что будет в PhpStorm 2020.1 — Каждую неделю новый 5-минутный ролик.
- PHP для абсолютных новичков — 5 часов видеоуроков.
- PHP Internals News podcast #40 — C Никитой Поповым о тройке принятых мелких RFC.
- PHP Internals News podcast #41 — Со Steven Wade о предложении добавить магический
__toArray()
. - The Undercover ElePHPant #8 — О тюнинге php-fpm с Arne Blankerts из thephp.cc. И блогпост с основными моментами.
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку — Попробуем через GitHub.
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 173