Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 7.4 RC6, Symfony 5.0 и 4.4, WordPress 5.3 и другие релизы, об обновлении PSR-стандартов, RFC предложения из PHP Internals, порция полезных инструментов, митапы, видеозаписи, подкасты и многое другое.
Приятного чтения!
Новости и релизы
- PHP 7.4.0 RC6 — Последний релиз-кандидат. Финальный релиз запланирован на 28 ноября, a пока можно посмотреть что нового в PHP 7.4, прочитать про Стрелочные функции в PHP 7.4, глянуть Введение в PHP FFI.
- PHP 7.2.25 — Поддержка ветки заканчивается и релиз 7.2.26, который ожидается 19 декабря, будет последним регулярным выпуском. После этого будут только секьюрити обновления по мере необходимости в течение года.
- PHP 7.3.12
- Обновление стандартов PSR — Заканчивается голосование по процедуре обновления интерфейсов в связи с добавлением тайпхинтов. Предлагается двухэтапный план: выпустить версию 1.1 для стандартов, в которой добавят декларации типов для параметров, и затем v2.0 с тайпхинтами возвращаемых значений. Подробнее о причинах и рассмотренных альтернативных подходах.
- WordPress 5.3 — В обновлении улучшения для блочного редактора Guttenberg (кстати доступен для Laravel в виде пакета VanOns/laraberg), новая тема Twenty Twenty, совместимость с PHP 7.4.
- skyeng/php-communities — Открытый список PHP-событий, спикеров и организаторов на GitHub. Ближайшие мероприятия:
• 29 ноября, Уфа: Встреча PHP-разработчиков Уфы
• 30 ноября, Иваново: PHP: Неправильный путь
• 7 декабря, Йошкар-Ола: PHP Meetup December
• 10 декабря, Одесса: PHP OpenSource world. Stable multi-threaded application.
• 14 декабря, Казань: Большая встреча PHP-разработчиков
PHP Internals
- [RFC] Weak maps — В PHP 7.4 была добавлена поддержка слабых ссылок через специальный класс WeakReference. Но в действительности для приложений нужна коллекция WeakMap, которую нельзя реализовать на основе WeakReference. Собственно, её и предлагается добавить. Скрытый текст
$map = new WeakMap(); $obj = new stdClass(); $map[$obj] = 42; var_dump($map); // object(WeakMap)#1 (1) { // [0]=> // ["key"] => object(stdClass)#2 (0) {} // ["value"] => int(42) // } // } // Объект уничтожается здесь, // и ключ автоматически удаляется из WeakMap unset($obj); var_dump($map); // object(WeakMap)#1 (0) { // }
- [RFC] Implement new DOM Living Standard APIs in ext/dom — Предложение о реализации поддержки нового стандарта DOM в расширении ядра почти принято единогласно.
- [RFC] Deprecate Backtick Operator (V2) — Отклонено на голосовании.
- [RFC] Union Types 2.0 — Предложение принято практически единогласно и в PHP 8.0 нас ждут объединённые типы. Синтаксис
T1|T2|...
можно будет использовать везде, где типы можно указывать сейчас. - PHP Internals News podcast #36 — О тех RFC, которые не прошли в PHP 7.4.
Инструменты
- lisachenko/z-engine — Экспериментальная библиотека, которая позволяет используя FFI получить доступ к внутренним структурам самого PHP, таким как zend_class_entry, zval, и подобным, и изменять их в рантайме. Это позволяет делать самые немыслимые манипуляции в рантайме.
- nette/safe-stream — Библиотека позволяет производить атомарные и безопасные чтение/запись файлов с помощью стандартных функций PHP.
- krakjoe/ilimit — Расширение позволяет выполнить функцию наложив при этом ограничения на время и память, которые может потребовать вызов.
- Twig 3.0 — Под капотом много мелких улучшений, повышена производительность, почищен код.
- fzaninotto/Faker 1.9 — Более сотни улучшений и исправлений в свежем обновлении инструмента для генерации тестовых данных.
- cekta/di — Годная реализация PSR-11.
- tarantool-php/client — PHP-клиент для Tarantool. Бенчмарки PHP синхронных коннекторов для Tarantool запущенных в асинхронном/параллельном режиме с помощью расширений Swoole, Async и Parallel (и их комбинаций). Прислал rybakit.
- badoo/jira-client — Badoo Jira API Client: магия в Jira на PHP.
Symfony
- Symfony 4.4 — Подробнее о новых возможностях в блог постах и в полном списке изменений
- Symfony 5.0 — Включает в себя все обновления из 4.4, а также два новых компонента symfony/string и symfony/notifier. Fabien Potencier представляет компонент Notifier
Laravel
- thomasjohnkane/snooze — Отложенные нотификации. Пост в поддержку.
- mad-web/laravel-initializer — Настраиваемый пакет для быстрого создания приложения на Laravel. Прислал evgwed.
- Туториал по созданию пакета для Laravel
- О создании кастомных отношений в Laravel (перевод)
- Доменно-ориентированный Laravel — Продолжение серии о разработке крупных приложений на Laravel: о моделях, паттерне «состояние», управлении доменами.
- Как настроить масштабируемое приложение Laravel 6 с помощью DBaaS и хранилища объектов.
- Отключите HTTP сессии в Laravel, чтобы ускорить ваши API (Перевод)
- Пишем приложения на Laravel, которые легко поддерживать
- Делим Laravel на компоненты
- Организация маршрутов в Laravel
- Серия стримов о создании laravel-shift/blueprint
Yii
Async PHP
- DriftPHP — PHP-фреймворк на основе ReactPHP и компонентов Symfony. Демо приложение.
- clue/reactphp-ami — Асинхронный инструмент для управления Asterisk. Вводный блог пост в поддержку.
- PHP-Watcher: инструмент, который упрощает разработку долгоживущих приложений
- Пишем RESTful API с помощью ReactPHP: Защищённые роуты
Материалы для обучения
- 5 способов улучшить производительность PHP — и подкаст The Undercover ElePHPant #2 с Marco «Ocramius» Pivetta.
- Как быстро обновить версию PHPUnit с 4 вплоть до PHPUnit 8.
- Ответы на часто задаваемые вопросы по Serverless PHP — Как локально запускать серверлесс PHP-приложения? Как на практике масштабируются затраты? Как справиться с дополнительными расходами, связанными с DDoS-атаками или пиковыми нагрузками?
- Пишем свой Doctrine Annotation Fixer для PHP-CS-Fixer — Исследование внутренностей фиксера для создания своего правила. Прислал vtvz_ru.
- Уровни изолированности транзакций БД для самых маленьких.
- Как добавить проверки в NoVerify, не написав ни строчки Go-кода.
- PHP Composer: фиксим зависимости без боли — О том, какую проблему решают плагины для патчинга зависимостей и почему использовать вместо этого форки неудобно.
Аудио/Видео
- Туториал по использованию HTTP-клиента в PhpStorm
Laravel Snippet #18: Clear Writing, Great Quality, Low Pain Tolerance — Продолжение серии подкастов от Тейлора о том, как заработать на опенсорсе.
Marco Pivetta: Aggressive PHP Quality Assurance in 2019
Symfony Camp 2019
PHP Internals News podcast #35 — Со Scott Arciszewski о недавней уязвимости в PHP-FPM, и криптографии в PHP.
Комментарии (15)
shandy
25.11.2019 22:26+2Темпы развития языка впечатляют. 10 лет развития от PHP5 то PHP7 версии и всего 5 лет (тьфу-тьфу) от PHP7 до PHP8 версии, причем за 5 лет было/будет сделано больше чем за предыдущие 10.
Конечно, всегда хочется большего (дженерики, асинхронность) но и без этого PHP это уже не язык для «домашних страниц»)SerafimArts
26.11.2019 03:25+1С этими "хотелками" всё довольно сложно… В PHP типизация чекается в рантайме, так что...
PHP 7.3) Представим, что нужно проверить возвращаемый T, раньше (т.е. php 7.3 и ниже) мы максимум что делали — это ассерт на то, что значение является T.
PHP 7.4) Сейчас надо проверить что значение — это instanceof T, т.е. построить цепочку зависимостей [T -> parent of T -> parent of parent of T -> etc.]
PHP 8.0) Юнион типы: А теперь представим, что возвращаемый T — это T = X | Y. В этом случае нужно уже на уровне языка строить граф, где [T -> X + Y -> parent of X | parent of Y -> etc]
Ideal PHP) А теперь представим что будет с дженериками, когда этот граф не только километровый (но всё же который можно закешировать), но ещё и создаётся в рантайме! Когда
new Some<Any>
просто берёт и перекраивает его налету, меня всё внутри. И это я уж не говорю про то, что после юнионов 7.4 планируется добавление декларации этих юнионов через конструкцииtype T = X | Y;
Т.е. дженерики мб и добавят, но надо быть готовым к тому, что они будут просаживать производительность в ноль.
shandy
26.11.2019 15:10Так как раз вот тут и должна JIT компиляция помочь? Тут же как раз про яйцо и курицу, JIT сейчас ничего не привносит, а дженерики наоборот привнесут даунгрейд производительности. Что первое внедрять? )
istepan
26.11.2019 08:15PHP8 будет новой вехой.
Ещё бы параметры в стандартных функциях привели в порядок.
Ну и тернарный оператор за одно, если ломать совместимость.t_kanstantsin
26.11.2019 10:50+1Тернарный оператор уже: https://wiki.php.net/rfc/ternary_associativity
evgwed
27.11.2019 11:00Не получится ли как с python2 и python3? Комьюнити явно не оценит поломку обратной совместимости.
P.S. Если уже ломать обратную совместимость, я бы еще иммутабельность завёз.istepan
27.11.2019 11:03Да, к сожалению так и выйдет. Тогда можно сделать отдельный класс со статичными методами, по аналогии с DataTime.
evgwed
27.11.2019 11:17+1Возможно будет лучше. Я бы с радостью пользовался классом Array, который делает нормальный порядок аргументов для привычных методов. А то сейчас это просто мешанина, где нужно помнить каждый аргумент в каком порядке передавать. Пример:
иarray_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] ) : bool
array_map ( callable $callback , array $array1 [, array $... ] ) : array
В array_walk идет первый массив, а затем функция, а в array_map наоборот.
А вообще, было бы здоров не только статику делать по типу:
Array::map(callable $callback , array $array1)
Было бы круто делать так:
$list = [1, 2, 3]; $result = $list->map(fn($item) => $item * 2);
hanovruslan
Хотел оценить
Drift PHP Framework
но сайт https://driftphp.com недоступенgreabock
Хабраэффект, очевидно
berezuev
Он и до дайджеста не работал.
Оно и не удивительно, репозиторий с сайтом пустой
greatkir
(deleted, дубль)
seregazhuk
Да, сайт ещё пока в разработке. Доступен пока только фреймворк и демо приложение.