PHP Digest
8.53K subscribers
60 photos
3 videos
287 links
PHP Дайджест

Новости, материалы и инструменты из мира PHP — раз в месяц.

Вопросы, замечания, предложения: @pronskiy
Download Telegram
[RFC] Weak maps

https://wiki.php.net/rfc/weak_maps

В PHP 7.4 была добавлена поддержка слабых ссылок через специальный класс WeakReference.
Развивая идею дальше, для PHP 8 Никита предлагает добавить коллекцию WeakMap, которая, по сути, будет аналогом SplObjectStorage, то есть множество, в котором ключами выступают объекты. Изюминка в том, что если объект, который был ключом, перестаёт существовать (на него нет других ссылок), то он автоматически пропадает и из коллекции WeakMap.
Чёрная магия 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 и работает со структурами на низком уровне. Поэтому вполне возможны сегфолты, утечки памяти и другие неприятные последствия. Так что, только для тестов.
PHP-Дайджест № 168

PHP 7.4 RC6, Symfony 5.0 и 4.4, WordPress 5.3 и другие релизы, об обновлении PSR-стандартов, RFC предложения из PHP Internals, порция полезных инструментов, митапы, видеозаписи, подкасты и многое другое!

https://habr.com/p/477318/
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
Вышел PhpStorm 2019.3

https://habr.com/ru/company/JetBrains/blog/478030/

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

А подробный разбор прям всех изменений смотрите в хабрапосте.
PHP-Дайджест № 169

PHP 7.4, PhpStorm 2019.3, InfectionPHP и другие релизы, статистика версий PHP, об использовании FFI, видео с прошедших конференций и митапов, порция полезных инструментов, и многое другое.

https://habr.com/ru/post/479306/
Как выбрать файлы для предзагрузки в 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 скрипт, который подгрузит нужные классы в опкэш. Звучит как годная идея, надо пробовать.
Если этим субботним утром вы думаете что бы посмотреть, то вот трансляция митапа в Казани https://www.youtube.com/watch?v=zZTv7HMxKXI
В программе аж 6 докладов.

Кстати, в списке мероприятия на декабрь в последнем выпуске дайджеста не было митапа SymСode в Питере. Он пройдёт 18 декабря в офисе JetBrains https://www.meetup.com/ru-RU/symcode/events/267106695/
Пока делал видео об обновлении на 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% случаев.
PHP-Дайджест № 172

PHP 7.4.2 и другие релизы, Stringable RFC, обзор PHP 8, порция полезных инструментов, 4 ближайших митапа, видеозаписи с конференций, стримы и многое другое!

https://habr.com/p/485592/
Дженерики в PHP

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

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 Russia 2020
#конференции #розыгрыш

https://phprussia.ru/moscow/2020/

Раз у меня есть доступ к конференциям, то почему бы не воспользоваться админресурсом и не делиться этим с вами? Если идея зайдёт, то будем разыгрывать билеты на другие мероприятия чаще. В пуле уже есть PHP fwdays, Laracon Online, PHPKonf, PHP Serbia.

Начнём с конференции в Москве.
Что имеем на данный момент:
• Nicolas Grekas, по сути, главный человек в разработке Symfony сегодня
• Макс Рафалко, автор Infection, о мутационном тестировании из первых рук
• Антон Титов, автор RoadRunner, но на этот раз с докладом о своей Cycle ORM
• Алексей Матюхин из Badoo о реальном опыте применения стат анализа (PHPStan, Psalm, Phan, NoVerify)

Промокод на билеты со скидкой 7%: PHPDIGEST

На конференцию можно попасть бесплатно, если ты докладчик :Roll Safe: 💁🏿‍♂️
Приём заявок открыт ещё два дня: https://conf.ontico.ru/lectures/propose?conference=pc2020

А вот и розыгрыш билета.
Всё, что нужно сделать, просто нажмите на кнопку, но только если вы сможете приехать в Москву 13 мая на конференцию PHP Russia 2020. (Счётчик обновляется с задержкой)
Если не сможете приехать, пожалуйста, не жмите.
*****
Победители: Andrew Tkachuk
PHP-Дайджест № 174

5 новых RFC из PHP Internals, а также предложение по развитию языка и пара прототипов новых фич для PHP в виде пул-реквестов, порция полезных инструментов, видео, подкасты и многое другое.

https://habr.com/p/489662/