PHP-Дайджест № 174 (10 января – 24 февраля 2020)
Свежая подборка со ссылками на новости и материалы. В выпуске: 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 {
public int $a = 1; public string $b; public array $c = ["foo"]; 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...
Инструменты
Symfony
Laravel
Yii
Async PHP
Материалы для обучения
Аудио/Видео
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку — Попробуем через GitHub.
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 173