ru
Feedback
PHP Digest

PHP Digest

Открыть в Telegram

PHP Дайджест Новости, материалы и инструменты из мира PHP — раз в месяц. Вопросы, замечания, предложения: @pronskiy

Больше
8 208
Подписчики
-324 часа
-87 дней
-3930 день
Архив постов
Будущее развитие PHP https://github.com/nikic/php-rfcs/blob/language-evolution/rfcs/0000-language-evolution.md Никита опубликовал черновик RFC с предложением установить механизм введения в язык новых глобальных или ломающих обратную совместимость фич. И рассмотрел возможные пути решения: 1. Новый язык (P++) При всех своих недостатках, одно из преимуществ тут в том, что можно делать совершенно радикальные изменения. Например, убрать $ из переменных. Но мы помним судьбу Perl/Raku. 2. Editions (редакции/издания) Идея позаимствована из Rust, в разработку которого Никита тоже вовлечён. По сути, это набор обратно-несовместимых изменений, объединенных под одним именем. Такой вариант интересен как с технической так и с маркетинговой точки зрения. 3. Директивы declare на каждую фичу То есть на каждое крупное изменение вводить отдельную директиву по типу strict_types. ___ Поскольку против нового языка уже неофициально проголосовали и единогласно отмели идею, то дальше Никита рассматривает технические аспекты реализации единшов/директив. Варианты тут такие: • Текущая реализация с объявлениями в каждом файле declare(strict_types=1) или в случае едишнов declare(edition=2020) • Новый открывающий тег Например, для едишнов: <?php2020 • Указание директив для пространств имён (RFC)
namespace_declare('Vendor\Lib', [
    'strict_types' => 1,
    'no_dynamic_properties' => 1,
    // ...
]);

• Ввести понятие пакета в PHP Прототип этого варианта оформлен в виде пул-реквеста. Пакет надо будет явно объявлять в каждом файле.
<?php

package "nikic/php-parser";

namespace PhpParser\Node;

• Что-то на основе файловой системы Например добавлять файл .package.php в корне пакета, который будет содержать нужную метаинформацию. В конце Никита подводит выводу, что оптимальный вариант — это едишны + declare директивы в каждом файле.

PHP-Дайджест № 173 PHPUnit 9 и другие релизы, 3 свежих RFC предложения из PHP Internals, порция полезных инструментов, видео, подкасты и многое другое! https://habr.com/p/487690/

PhpStorm 2020.1 EAP https://blog.jetbrains.com/phpstorm/2020/01/phpstorm-2020-1-early-access-program-is-now-open/ Upd: Поправ
PhpStorm 2020.1 EAP https://blog.jetbrains.com/phpstorm/2020/01/phpstorm-2020-1-early-access-program-is-now-open/ Upd: Поправил ссылку. Наконец-то запустили программу раннего доступа для первого в этом году мажорного релиза PhpStorm. Будем улучшать разные подсистемы, в том числе вывод типов в PHP, VCS и прочее. Конечно, производительности будет много внимания. Описывать все изменения планирую порциями каждую неделю, поэтому подписывайтесь на Twitter phpstorm или старый добрый RSS блога. В первом посте об улучшениях для Composer – теперь практически всё можно делать прямо в редакторе в файле composer.json. Есть автокомплит, переходы к файлам, запуск скриптов и прочее. + PCOV и PHPDBG для подсчёта покрытия, кастомизация тегов Twig, минимально обновили светлую тему, шрифт JetBrains Mono по умолчанию, пачка улучшения для Git, но о них позже. По традиции EAP билды выходят каждую неделю и их можно использовать совершенно бесплатно.

Дженерики в PHP Последние пару недель Никита Попов работал над исследованием возможности реализации дженериков. Если коротко, то, по словам Никиты, есть несколько серьёзных трудностей и он в целом пока не уверен, что добавить полноценные дженерики в PHP это хорошая идея. Есть PR с прототипом реализации https://github.com/nikic/php-src/pull/3 и все проблемы и открытые вопросы подробно изложены вот тут https://github.com/PHPGenerics/php-generics-rfc/issues/45

PHP-Дайджест № 172 PHP 7.4.2 и другие релизы, Stringable RFC, обзор PHP 8, порция полезных инструментов, 4 ближайших митапа, видеозаписи с конференций, стримы и многое другое! https://habr.com/p/485592/

PHP-Дайджест № 171 4 свежих RFC из PHP Internals и интересные пул-реквесты в PHP 8, порция полезных инструментов, подкасты, стримы и многое другое! https://habr.com/p/483684/

PHP-Дайджест № 170 CakePHP 4, Codeception 4, Phalcon 4 и другие релизы, порция полезных инструментов, подкасты, видео с прошедших митапов, и многое другое! https://habr.com/p/481564/

Пока делал видео об обновлении на PHP 7.4 с помощью PhpStorm, Никита обратил моё внимание на то, что сеттеры работают медленнее, чем присвоение свойствам напрямую. Пришлось сделать микробенчмарк. Не верить же Никите на слово?! https://gist.github.com/pronskiy/492a0590d0fd3cfa0a02a2d7f908c494
Set typed public property:       1.408833026886s
Set via setter (no type check):  3.0818917751312s
Set private property via setter: 3.1216759681702s
Set private property via magic:  20.88130402565s

Если сеттер тривиальный, то с типизированными свойствами в нём мало смысла. Поэтому в видео есть руководство, как сделать квик-фикс для PhpStorm с помощью SSR, чтоб заменять сеттеры на лету там, где необходимо. ⚠️ Бежать и выкидывать сеттеры только из-за перфоманса смысла не имеет в 99% случаев.

Если этим субботним утром вы думаете что бы посмотреть, то вот трансляция митапа в Казани https://www.youtube.com/watch?v=zZTv7HMxKXI В программе аж 6 докладов. Кстати, в списке мероприятия на декабрь в последнем выпуске дайджеста не было митапа SymСode в Питере. Он пройдёт 18 декабря в офисе JetBrains https://www.meetup.com/ru-RU/symcode/events/267106695/

Как выбрать файлы для предзагрузки в PHP 7.4 https://github.com/DarkGhostHunter/Preloader Многие ожидали, что поддержку предзагрузки сделают прям в Composer. Но, судя по всему, в ближайшее время это не будет реализовано. Для Symfony поддержку уже выкатили сами https://symfony.com/blog/new-in-symfony-4-4-preloading-symfony-applications-in-php-7-4 Для Laravel обещают, но из-за использования алиасов пока будут проблемы. А как быть с произвольным приложением? Можно попробовать загрузить все файлы. Если не нарвётесь на segfault и ряд других нюансов (подробнее https://habr.com/ru/company/badoo/blog/472528/), то это сработает и должно дать прирост. Но эффективнее загружать не все классы, а только самые часто используемые. И вот вопрос как узнать какие это? Появился вот такой инструмент: https://github.com/DarkGhostHunter/Preloader Он предлагает сначала собрать статистику по используемым классам из самого опкэша во время запусков приложения. А потом по этой статистике уже сгенерировать preloader.php скрипт, который подгрузит нужные классы в опкэш. Звучит как годная идея, надо пробовать.

PHP-Дайджест № 169 PHP 7.4, PhpStorm 2019.3, InfectionPHP и другие релизы, статистика версий PHP, об использовании FFI, видео с прошедших конференций и митапов, порция полезных инструментов, и многое другое. https://habr.com/ru/post/479306/

Вышел PhpStorm 2019.3 https://habr.com/ru/company/JetBrains/blog/478030/ Вслед за релизом PHP 7.4, вчера выпустили третий мажорный релиз PhpStorm в этом году. Возможно вы уже даже успели обновиться и посмотреть, что нового. Но если нет, то всё самое важное можно глянуть в коротком видеоролике (англ): https://www.youtube.com/watch?v=h9KGsD87t_M (поправил ссылку) А подробный разбор прям всех изменений смотрите в хабрапосте.

PHP 7.4 Вышла в свет новая версия интерпретатора PHP! https://www.php.net/releases/7_4_0.php Среди заметных изменений: • Типизированные свойства • Стрелочные функции • Предзагрузка • FFI • Распаковка в массивах • Разделитель для числовых литералов • Слабые ссылки • Возможность бросать исключения в __toString() Быстро посмотреть новые фичи можно в руководстве по миграции https://www.php.net/manual/en/migration74.new-features.php Полный список изменений: https://github.com/php/php-src/blob/php-7.4.0/UPGRADING

PHP-Дайджест № 168 PHP 7.4 RC6, Symfony 5.0 и 4.4, WordPress 5.3 и другие релизы, об обновлении PSR-стандартов, RFC предложения из PHP Internals, порция полезных инструментов, митапы, видеозаписи, подкасты и многое другое! https://habr.com/p/477318/

Чёрная магия PHP https://github.com/lisachenko/z-engine Как замокать финальный класс или переопределить финальный метод? Ну допустим, для этого есть badoo/soft-mocks. А как насчёт добавить интерфейс к существующему классу в рантайме? Или, например, изменять тип объекта. Новая библиотека от Александра Лисаченко потенциально позволяет делать вообще всё что угодно. В PHP 7.4 добавлена новая возможность – FFI, которая позволяет подгружать сишные модули (.dll or .so), и вызывать функции из них или использовать структуры данных из C на чистом PHP. Библиотека Z-Engine использует FFI, чтобы получить доступ к внутренним структурам самого PHP! Z-Engine читает нативные структуры PHP, например, zend_class_entry, zval, и подобные и может изменять их в рантайме.
// Сделаем абстрактный класс обычным
$refClass = new ReflectionClass(TestClass::class);
$refClass->setAbstract(false);
assertFalse($refClass->isAbstract());
$instance = new TestClass();
assertInstanceOf(TestClass::class, $instance);

Осторожно! Библиотека предоставляет практически неограниченный доступ к памяти самого PHP и работает со структурами на низком уровне. Поэтому вполне возможны сегфолты, утечки памяти и другие неприятные последствия. Так что, только для тестов.

C результатом 61 голосов против 5 предложение принято. В PHP 8.0 нас ждут объединённые типы.

[RFC] Weak maps https://wiki.php.net/rfc/weak_maps В PHP 7.4 была добавлена поддержка слабых ссылок через специальный класс W
[RFC] Weak maps https://wiki.php.net/rfc/weak_maps В PHP 7.4 была добавлена поддержка слабых ссылок через специальный класс WeakReference. Развивая идею дальше, для PHP 8 Никита предлагает добавить коллекцию WeakMap, которая, по сути, будет аналогом SplObjectStorage, то есть множество, в котором ключами выступают объекты. Изюминка в том, что если объект, который был ключом, перестаёт существовать (на него нет других ссылок), то он автоматически пропадает и из коллекции WeakMap.

PHP-Дайджест № 167 PHP 7.4.0 RC5, Xdebug 2.8, критическая уязвимость в PHP-FPM, новости из PHP Internals, порция полезных инструментов, подкасты, стримы и многое другое! https://habr.com/p/474380/

Помните язык Perl? Совсем недавно после долгих споров сообщество Perl приняло решение переименовать Perl 6 в Raku. Дело в том, что Perl 6 не стал продолжением Perl 5, как ожидалось изначально, а превратился в отдельный язык, для которого так и не было подготовлено инструментария по миграции с Perl 5. В итоге под одним именем Perl существовало два параллельно развивающихся самостоятельных языка, не совместимых друг с другом и имеющих свои сообщества разработчиков. Всё это очень напоминает историю с P++, которая, к счастью, не получила продолжения, и пока оставила след лишь в виде стикеров и футболок. Понаблюдаем, как будет развиваться судьба Perl/Raku.

Свежие подкасты про PHP SDCast #109 с Антоном Титовым, автором RoadRunner и Cycle ORM. https://sdcast.ksdaemon.ru/2019/10/sdcast-109/ The Undercover Elephpant с Derick Rethans автором Xdebug о том как устроена сборка мусора в PHP. https://undercover-elephpant.com/episodes/what-is-garbage-collection-in-php-and-how-do-you-make-the-most-of-it-with-derick-rethans Laravel Snippet – подкаст Тейлора. В последних эпизодах он делится советами о том, как строить бизнес на опенсорсе. Если ещё не слушали, рекомендую. https://share.transistor.fm/s/bc9c3206 Пятиминутка PHP: DDD #7 — Парадигмы моделирования и многоуровневая архитектура – продолжение серии выпусков по знаменитой книге Эрика Эванса Domain-Drived Design. https://5minphp.ru/episode71/