Русский
Русский
English
Статистика
Реклама

Php 8.1

Перевод От версии 8 к 8.1 новый виток развития PHP

24.04.2021 12:23:53 | Автор: admin


Я уже несколько раз писал о том, что происходило с PHP за год и всегда с нетерпением ждал следующего года. Я делал это в 2020-м и 2019-м. И продолжаю делать в 2021-м.

Я всегда повторяю: PHP это уже не тот язык, которым он был десять лет назад, и мы очень этому рады. Сегодня это быстрый и надёжный язык, позволяющий разрабатывать сложные и масштабируемые приложения. Давайте обсудим некоторые из наиболее заметных изменений, которые появились за год как в самом языке, так и в экосистеме.

От версии 8 к 8.1


Новая мажорная версия PHP 8 появилась в конце прошлого года. Я уже много об этом писал, так что не буду здесь повторяться. Как всегда, его производительность становится всё лучше и лучше. Этот факт подтверждают тесты от Kinsta.

Во многом, это заслуга компилятора JIT (Just in time, на лету). Он действительно улучшает производительность (что особенно справедливо для математических операций). Но счастье было бы не полным, если бы ранее в PHP 7.4 не появилась предзагрузка. Она компилирует исходные файлы в опкоды и связывает зависимые классы, трейты и интерфейсы. Такой скомпилированный фрагмент исполняемого кода (то есть кода, который может использовать PHP-интерпретатор) сохраняется в памяти и становится доступен для всех запросов. Это положительно влияет на производительность, если вы, конечно, не используете виртуальный хостинг.



Стоит также упомянуть атрибуты (они же аннотации), именованные параметры (Named Arguments) и объявление свойств в конструкторе (Constructor Property Promotion), поскольку они определённо способствовали тому, что 8-я версия PHP получилась настолько удачной.

Не останавливаясь на достигнутом, PHP Core Team уже работает над следующей версией, PHP 8.1, которая должна выйти к концу 2021 года. На данный момент больше всего заслуживают внимания перечисления (enums) и файберы (fibers, зелёные потоки). Я ещё буду говорить о них позже в этой статье.

Год за годом команда выдаёт стабильные версии с множеством фич и других нововведений, улучшающих жизнь PHP-разработчикам. Среди прочего, в этот раз был усовершенствован процесс миграции. Я достаточно быстро перетащил некоторые из моих собственных проектов с PHP 7.4 на PHP 8: мне потребовалось около часа на каждый проект. Так что, у нас осталось ещё меньше поводов откладывать миграцию.

Система типов


Наконец-то в PHP добавят перечисления.

enum Status {case Pending;case Active;case Archived;}

Ниже пример их использования:

class Order{public function __construct(private Status $status = Status::Pending;) {}public function setStatus(Status $status): void{// }}$order->setStatus(Status::Active);

Кроме того, появился RFC-запрос на добавление в язык нового типа never.

Использование never будет означать, что функция с таким типом возвращаемого значения не сможет вернуть результат и должна прервать выполнение программы выбросить исключение, вызвать exit или сделать это каким-то другим способом.

function dd(mixed $input): never{// dumpexit;}

Отмечу, что never принципиально отличается от void: функция с возвращаемым значением типа void способна вернуть результат, а значит, прерывать работу программы нет необходимости. Такое нововведение может показаться слегка необычным, но оно обязательно найдёт применение в статическом анализе кода.

И ещё пару слов о статическом анализе: PhpStorm добавил встроенную поддержку анализаторов Psalm и PhpStan. После этого количество пользователей этих двух продуктов должно увеличиться.

К сожалению, дженерики (generics) по-прежнему нативно не поддерживаются. Есть несколько серьёзных проблем. В первую очередь, не забывайте, что PHP это всё ещё язык с динамической типизацией. Здесь Nikita уже писал о связанных с этим проблемах. На мой взгляд, самый простой выход нативно реализовать поддержку лишь так называемых runtime-erased generics, добавив в язык новый синтаксис без применения каких-либо дополнительных проверок типа во время выполнения и полагаясь на статический анализ. Однако, для этого требуется больше, чем просто техническое решение: нужно изменить мышление участников PHP-сообщества в целом. Может быть, когда-нибудь это станет возможным. Когда-нибудь.

Асинхронный PHP


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

Простой пример использования файберов:

$fiber = new Fiber(function (): void {$valueAfterResuming = Fiber::suspend('after suspending');// });$valueAfterSuspending = $fiber->start();$fiber->resume('after resuming');

Хотя одних только файберов недостаточно для того, чтобы язык стал по-настоящему асинхронным. Они могут лишь стать маленькой шестерёнкой в большой асинхронной машине.

Однако, соответствующий RFC снова вызвал интерес у автолюбителей асинхронности, чему мы можем только радоваться. Популярность асинхронных фреймворков, таких как Amphp и ReactPHP, растёт: недавно Laravel объявил о встроенной поддержке Swoole и RoadRunner.

Экосистема PHP


Я не могу не вспомнить о новом релизе Composer 2.0, который вышел в октябре 2020 года. В этой версии есть несколько улучшений UX, но, что важнее всего, она демонстрирует большой прирост производительности. В условиях чистой установки прирост достигает 300%. Разница очень заметна на боевых проектах. Не зря пакетный менеджер Composer де-факто стал стандартом для PHP-разработчиков.

Мне нравится время от времени оценивать состояние экосистемы PHP, просматривая количество пакетов, доступных для скачивания. В прошлом году я говорил о 25 миллионах загрузок в день. Сегодня это число увеличилось более чем вдвое, и мы уже видим 60 миллионов загрузок в день.

Наконец, взгляните на этот график, в котором показано, как менялось количество доступных пакетов / версий с течением времени. Его можно найти на сайте Packagist.com. Вы можете сами оценить, как растёт экосистема. И конца этому не видно.


Дальше больше


Давайте подытожим, пройдясь по всему, что было добавлено в PHP за последние годы. Если вы не следите за его развитием, матрериалы из списка помогут восполнить этот пробел. Я думаю, он наглядно показывает рост сообщества и команды разработчиков за последние годы. Уверен, что дальше будет ещё лучше.


Так что, PHP жив и чувствует себя очень даже хорошо. С каждым годом я всё больше доволен развитием языка и, конечно же, буду использовать его ещё многие годы!



Наши серверы можно использовать для разработки на PHP.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Каким будет 2021-й год для PHP?

15.02.2021 16:13:26 | Автор: admin

Об этом мы спросили Никиту Попова, Дмитрия Елисеева и еще десяток активных контрибуторов и авторов контента из сообщества. Все они поучаствуют в большом PHP-стриме днем 27 февраля (это суббота). Будет пара свежих докладов, несколько острых дискуссий, розыгрыш фирменных PHP-слонов и других крутых подарков. Подключайтесь!


Роман Пронский (JetBrains), автор PHP-дайджеста. Соведущий нашего митапа

Каким будет 2021-й год для PHP, чего ждешь?

Будет PHP 8.1, будут крутые движухи в сообществе.

Самое плохое, что случилось в мире PHP в 2020?

Отмена конференций. Особенно жалко, что не было офлайн-версии PHP Russia очень жду ее в этом году!

Ок, а самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Было много всего. PHP исполнилось 25 лет было круто повспоминать все события за четверть века и подготовить страницу истории.

Онлайн-митапы плотно вошли в жизнь и оказались довольно крутыми. Благодаря им удалось познакомиться с кучей новых людей. Плюс, мы запустили с Валентином Удальцовым свой канал PHP Point.

А еще на свет появился панк-слоник PhpStorm. Правда, из-за падемии не удалось завезти его в Россию и Украину. Надеюсь в 2021-м он наконец-то доберется до нас физически.


Валентин Удальцов, автор телеграм-канала Пых. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Надеюсь, что офигенным! Со своей стороны хочу реализнуть до лета библиотеку Thesis для нативной работы с SQL.

Самое хорошее, что случилось в контексте PHP в 2020?

Я интегрировался с русскоговорящее PHP-сообщество: это и год помогло провести веселее, и узнать-рассказать много нового.


Дмитрий Елисеев, автор блога ElisDN. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP и сообщества?

Надеюсь на возобновление оффлайн-активности. Хочется погулять по митапам.

Самое хорошее, что случилось в контексте PHP в 2020?

У меня в 2020-ом случилось внедрение вышедшего в 2019-ом PHP 7.4. Семёрка мне была интересна в основном явной типизацией. Вот наконец type hints добрались и до полей. В проектах вычистил кучи PHPDoc-ов и стало удобнее для Psalm-а.

Понравился рост распространённости Psalm. Его активно внедряют популярные библиотеки вроде Doctrine, Laminas. Да и для кода без него появляются плагины и стабы. Это позитивно сказывается на качестве интерфейсов. Уходят union types. Если в начале года приходилось туго с его внедрением в проект, то сейчас намного приятнее. Но пока с этим туго у некоторых стандартных PHP-функций.

Также за год прилетело много мажорных релизов. Тот же сильно ускоренный Composer 2 и новый Xdebug 3. Обрадовала интеграция сниферов и Psalm в PhpStorm.

Самое плохое, что случилось в мире PHP в 2020?

Немного неприятно, что даже сейчас, в феврале 2021-го ещё не все библиотеки перевели на восьмёрку. А в остальном: меня все устраивает.


Илья Левин, разработчик в Skyeng, на митапе сделает доклад Как работают видеоконференции в браузере: фронт и бэк

Каким будет 2021-й год для PHP?

Жду совершенствования типизации и прочие удобняхи, которые позволят писать короткий и понятный код. 8-ка предоставила новые фичи в этом плане, но хочется еще лучше, короче, быстрее. Жду 8.1 и Symfony 5.3(Symfony просто прелесть, моя прелесть)))

Еще очень верю, что опять начнутся локальные митапы в оффлайне.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Если не говорить про 8-ку, отмечу два минорных релиза Symfony 5.1 и 5.2. Несмотря на пандемию, из-за которой пострадал весь мир, команда Symfony стабильно выпускает новинки.


Антон Околелов, ведущий подкаста Цинковый прод

Каким будет 2021-й год для PHP?

Хотелось бы асинхронных штук из коробки. Fibers мне не очень понравились, какие-то громоздкие конструкции, всё вручную. Это скорее подпорка для существующих решений-костылей (Swoole и тд). Но это тоже шаг вперед, по крайней мере кто-то задумался о проблеме.

Enums ждём, а еще лучше сразу с tagged unions и паттерн-матчингом.

Самое плохое, что случилось в мире PHP в 2020?

Отменили конференцию PHP Russia из-за пандемии. И еще я узнал, что Дмитрий Стогов не считает отсутствие асинхронщины в php проблемой номер один, это прям расстроило. Вот тот момент на видео:


Николай Пучко, автор телеграм-канала PHP Today. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Судя по некоторым RFC - противоречивым=) Очень боюсь, что станет настолько сладко, что слипнется, - если вы понимаете о чем я. Но некоторые вещи, например, enum, я очень жду.

Также жду релиз Yii3 - хочется чего-то новенького уже потрогать. Когда-то давно Yii поразил своей коробочной завершенностью. Кажется, что тройка по функционалу вполне сможет потягаться с Symfony.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)

Кажется, кроме восьмерки все прошло стабильно. Наверное, стоит отметить толчок к развитию сообщества в онлайне, который дал ковид. А у меня наконец нашлось время писать на Хабр и в канал.

Обратный вопрос

Тоже отмечу ковид, но в личном плане: у меня продуктивность выше в офисе, дома слишком много отвлекающих персон.


Антон Титов (SpiralScout), автор RoadRunner, на митапе представит самые упоминаемые доклады-2020 по версии сообщества

Каким будет 2021-й год для PHP?

Очень клевым! Жду интеграции Temporal.io в PHP, RoadRunner 2.0 и еще больше инструментов.

Самое хорошее, что случилось в мире PHP в 2020?

Релиз 8-ки все затмил!

Самое плохое, что случилось в мире PHP в 2020?

PHPclub окончательно скатился в неюзабельное состояние из-за токсичности.


Сергей Жук (Skyeng), автор подкаста "Между скобок". Соведущий нашего митапа

Каким будет 2021-й год для PHP?

Всё больше и больше внимания уделяется "асинхронной теме". Ожидаю развития в этом направлении: fiber-ы и фреймворки поверх ReactPHP.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Язык прошел отметку 25 лет. Дальше только туземун!

Самое плохое, что случилось в мире PHP в 2020?

Не состоялась PHP Russia.


Константин Буркалёв, ведущий подкаста SDCast. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Думается, что он должен быть просто стабильным: планомерное улучшение производительности, отшлифовка стандартов RFC. Надеюсь также, что оковы короны спадут и появится оффлайн-активность в сообществах.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Различные онлайн-активности: с дискуссиями, новыми форматами. Кажется где-то даже довелось поучаствовать :) Например, был классный стрим про код-ревью с ребятами из сообщества:


Александр Макаров (Yii), руководитель ПК PHP Russia. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Интересным. Будут новые RFC. Будут апдейты в рекомендациях PHP-FIG. Надеюсь, релизнем Yii 3.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

GitHub actions начали повсеместно использовать. Psalm. PhpStorm научился новым крутым штукам.


Пётр Мязин, ведущий подкаста Пятиминутка PHP. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

Ждём живого общения и тусовок в offline: PHP Russia, BeerPHP и других митапов

Самое хорошее, что случилось в контексте PHP в 2020 (кроме релиза 8-ки)?

Попробовал админ-панель Laravel Orchid, классная штука, по ходу дела появилось миллион идей как бы я всё переделал, улучшил или зарефакторил, но пока держу себя в руках :)

Обратный вопрос

Мало подкастов записал в 2020-м. Не хватало вдохновения. Даже купил новый микрофон себе к Новому году, чтобы исправить ситуацию. Но он так и лежит неопробованный(


Антон Жуков, разработчик в ManyChat. На митапе сделает доклад Тандем приложений на gRPC

Каким будет 2021-й год для PHP?

Время покажет. Я жду скорейшего LTS 8-й версии PHP и перехода на более стандартизированную версию PHP. Слабая стандартизация породила огромное количество legacy и продолжает этим заниматься.

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Серьезно обновилась документация. Появилось большое количество материалов по дебагу низкого уровня, асинхронке, тестированию. PHP всё быстрее идет в сторону языка с серьезной профессиональной поддержкой со стороны комьюнити. Это не может не радовать. Качество контента постепенно вытесняет количество. Это дорогого стоит.


Никита Попов (JetBrains), один из core team PHP. На митапе поучаствует в одной из дискуссий

Каким будет 2021-й год для PHP?

You tell me ;)

Самое хорошее, что случилось в мире PHP в 2020 (кроме релиза 8-ки)?

Оригинал ответа на английском

Okay, okay I think a small but important thing that happened in 2020, is the introduction of a "life support" phase for PHPUnit: After a PHPUnit version becomes unsupported, it will still be made compatible with new PHP versions for some time. For example, if you want to add support for PHP 8 to your library, you no longer need to also migrate to PHPUnit 9 at the same time, as PHPUnit 8 will also work. This is a big deal for me, because in my experience, making open-source libraries compatible with new PHP versions is very little about breaking changes in PHP, and a lot about breaking changes in PHPUnit.

Тэкс, дай подумать Думаю, что небольшая, но важная вещь, которая произошла в 2020 году, это долгосрочная поддержка PHPUnit: старые версии инструмента, которые больше не поддерживаются, будут оставаться совместимыми с новым версиями PHP какое-то время. Скажем, если вы хотите добавить в свою библиотеку поддержку PHP 8, то не надо еще и мигрировать на PHPUnit 9. C PHPUnit 8 тоже всё будет работать. Это важно, так как по моему опыту, если ты хочешь сделать опенсорсную библиотеку совместимой с новой версией PHP, в основном вопрос будет не в PHP, а именно в PHPUnit.

Самое плохое, что случилось в мире PHP в 2020?

Оригинал ответа на английском

It's not something "bad", but I'm somewhat disappointed in the practical impact of the Just-in-Time compiler in PHP 8. All past experience did indicate that the JIT compiler would probably not have much impact on typical web code, but I was still hoping that it would turn out differently in the end. The inheritance cache recently introduced in PHP 8.1 promises to have a much larger practical impact, with much less effort. Of course, there are cases where the JIT is useful, but I'm not quite convinced that the amount of effort Dmitry put into this project was worth it.Не то чтобы это было плохо, но я немного расстроен практической применимостью JIT-компилятора в PHP 8. Все тесты указывали, что JIT не будет сильно влиять на типичный код веб-приложений, но я до последнего надеялся. Inheritance cache в PHP 8.1 выглядит гораздо более обещающим с практической точки зрения, а усилий на него положено меньше. Безусловно, я знаю примеры, когда JIT оказался по-настоящему полезен, но я пока так и не уверен, что оно стоило времени и сил, которые Дмитрий положил на этот проект.

Не то чтобы это было плохо, но я немного расстроен практической применимостью JIT-компилятора в PHP 8. Весь прошлый опыт указывал на то, что JITособо не повлияет на типичные веб-приложения, но я до последнего надеялся. Inheritance cache в PHP 8.1 выглядит гораздо более многообещающим с практической точки зрения, а усилий на него положено меньше. Безусловно, я знаю примеры, когда JIT оказался по-настоящему полезен, но я пока так и не уверен, что оно стоило времени и сил, которые Дмитрий положил на этот проект.

P.S.

Никита и Дмитрий, судя по опросу русскоязычного PHP-сообщества об итогах 2020-го, JIT зашел многим. Спасибо за него и не только!

Остальные результаты этого опроса огласим на стриме.

P.P.S.

А еще разыграем пару слонов и другие полезные и приятные подарки для PHP-разработчика.

Полный список ништяков и другие подробности - тут.

Подробнее..

PHP-Дайджест 194 (1 14 декабря 2020)

14.12.2020 14:08:42 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: Enum в PHP 8.1, удаление Serializable и ограничение $GLOBALS, а также другие новости из PHP Internals, PhpStorm 2020.3, Symfony UX, порция полезных инструментов, видео, и первый PHP Дайджест Стрим.

Приятного чтения!



Новости и релизы


  • habrPhpStorm 2020.3: PHP 8, атрибуты, PHPStan и Psalm, Xdebug 3, Tailwind CSS и совместная разработка.
  • Slack куплен за $27 млрд Примечательно, то что бекенд Слэка изначально написан на PHP, а позже расширен на Hack.
  • WordPress 5.6 C бета-поддержкой PHP 8.
  • Статистика версий PHP 2020.2 Традиционная подборка статистики на основе данных, которые Composer отправляет при подключении к packagist.org.
    PHP 7.4: 42.61% (+22.55)
    PHP 7.3: 27.05% (-3.00)
    PHP 7.2: 15.28% (-12.21)
    PHP 7.1: 7.45% (-4.1)
    PHP 5.6: 2.71% (-2.28)
    PHP 7.0: 2.70% (-1.30)

PHP Internals


  • [RFC] Deprecate passing null to non-nullable arguments of internal functions В текущих версиях PHP стандартные функции без ошибок принимают null в качестве аргумента даже, когда параметр не nullable. Например, str_contains("", null)

    Проблема в том, что если объявить пользовательскую функцию с такой сигнатурой, то там аргумент null вызовет ошибку.
    str_contains("", null);// > No errorsfunction _str_contains ( string $haystack , string $needle ) : bool{    return true;}_str_contains("", null);// > Fatal error: Uncaught TypeError: Argument 2 passed to _str_contains() must be of the type string, null given
    

    Предлагается поэтапно исправить это несоответствие и в 8.1 бросать deprecation notice.

    Ну а пока можно добавить declare(strict_types=1); и проблема решена.
  • [RFC] Restrict $GLOBALS usage Сейчас, чтобы $GLOBALS вел себя как массив, приходится поддерживать еще один специальный тип INDIRECT и предоставлять прямую ссылку на внутреннюю таблицу символов PHP. Поддержка этого влияет на производительность всех операций с массивами в PHP.

    В этом RFC Никита Попов предлагает ограничить использование $GLOBALS.

    Продолжат работать чтение, запись, isset и unset:
    $GLOBALS['x'] = 1;echo $GLOBALS['x']isset($GLOBALS['x']);unset($GLOBALS['x']);
    

    И он не будет содержать рекурсивную ссылку на самого себя.

    А вот попытка изменить саму переменную $GLOBALS вызовет ошибку:
    $GLOBALS = [];$GLOBALS =& $x;$x =& $GLOBALS;unset($GLOBALS);
    

    Также ошибка будет, если передать $GLOBALS по ссылке в функцию:
    asort($GLOBALS);// > Compile-time error
    

    Забавный факт: именно об этом говорил Дмитрий Стогов на стриме отвечая на вопрос: что стоило бы убрать в следующих версиях PHP.
  • [RFC] Phasing out Serializable В 7.4 был введен новый механизм сериализации: наряду со старым интерфейсом Serialiazable были добавлены магические методы __serialize() и __unserialize().

    Предлагается постепенно полностью избавиться от Serializable. В PHP 8.1 его использование будет генерировать deprecation notice, а в PHP 9.0 compile-time error.
  • [RFC] Enumerations Ilija Tovilo и Larry Garfield провели исследования enum во всех языках и представили RFC, который вдохновлен Swift, Rust, и Kotlin.

    Enum это по сути класс, а его возможные значения это объекты. Это означает, что, на вопрос как бы вели себя Enums в ситуации X можно ответить так же, как и любой другой объект. Но есть несколько исключений.

    Описывается с помощью ключевых слов enum и case:
    enum Suit {  case Hearts;  case Diamonds;  case Clubs;  case Spades;}
    

    Переменным можно присваивать одно из значений:
    $val = Suit::Diamonds;function pick_a_card(Suit $suit) { ... }pick_a_card($val);        // OKpick_a_card(Suit::Clubs); // OKpick_a_card('Spades');    // TypeError
    

    Enum ведут себя как синглтон-объекты:
    $a = Suit::Spades;$b = Suit::Spades;$a === $b; // true$a instanceof Suit;         // true$a instanceof Suit::Spades; // true
    

    Есть возможность объявить скалярные Enum. Их можно прозрачно использовать в контексте, где ожидаются скалярные значения:
    enum Suit: string {  case Hearts = 'H';  case Diamonds = 'D';  case Clubs = 'C';  case Spades = 'S';}echo "I hope I draw a " . Suit::Spades;// prints "I hope I draw a S".
    

    Enum может иметь методы, в том числе статические. Пример использования метода для вывода списка опций чекбокса:
    enum UserStatus: string {  case Pending = 'pending';  case Active = 'active';  case Suspended = 'suspended';  case CanceledByUser = 'canceled';  public function label(): string {    return match($this) {      UserStatus::Pending => 'Pending',      UserStatus::Active => 'Active',      UserStatus::Suspended => 'Suspended',      UserStatus::CanceledByUser => 'Canceled by user',    };  }}foreach (UserStatus::cases() as $key => $val) {  printf('<option value="%s">%s</option>\n', $key, $val->label());}
    


    Из открытых пока еще вопросов остаются:
    Могут ли иметь свои методы значения case?
    Можно ли использовать конкретное значение в качестве тайпхинта? function stuff(Suit::Heart|Suit:Diamond $card) { ... }
    Разрешена ли сериализация Enum?
    Должно ли слово enum быть полностью ключевым? Тогда сломается весь код, который использует имя класса Enum. Или стоит сделать контекстное ключевое слово вот так: enum class UserStatus {...}
  • [RFC] Algebraic Data Types Предложение про Enum является первым шагом большого плана по реализации алгебраического типа в PHP. В качестве *возможных* дальнейших шагов рассматриваются tagged unions и pattern matching.
  • [RFC] Direct execution opcode file without php source code file Предлагается сделать возможным сохранять бинарный файл опкеша и запускать его уже без исходника. По сути, что-то очень похожее на питоновские файлы .pyc / .pyo.

    Формат опкода в PHP нестабилен и несовместим от версии к версии. Чтобы решить эту проблему, предлагается скомпилированный таким образом файл помечать в начале меткой <?phpo%php_version_id%.

    Такой файл можно будет подключать через стандартные функции include(), include_once(), require(), require_once().
  • [RFC] Wall-Clock Time Based Execution Timeout PHP измеряет всякого рода таймауты используя процессорное время. Это значит время затраченной в sleep() или сетевых запросах не учитывается. Например, это влияет на использование ini-настройки max_execution_time.

    В данном RFC всего лишь предлагается ввести новую установку max_execution_wall_time, которая бы учитывала реальное время вместо процессорного.

Инструменты


  • itsgoingd/clockwork v5.0 Отладочная панель и расширение для Chrome, которое добавляет вкладку в dev tools для отладки PHP-приложений. Подробный разбор инструмента смотрите в videoПятиминутке PHP.
  • nicofff/LazyIter Библиотека для работы с массивами в виде цепочек вызовов. Вдохновленная итератором из Rust. Пост про строгую типизацию в поддержку.
  • veewee/composer-run-parallel Позволяет параллельно запускать команды из секции scripts в composer.json.
  • clue/phar-composer Берет проект с composer.json и создает исполняемый архив phar со всеми зависимостями.
  • clue/commander Для быстрого создания консольных команд.
  • quasilyte/phpgrep 1.0 Инструмент для поиска по PHP-коду как grep, только с пониманием синтаксиса PHP.

Symfony



Laravel



Yii



Async PHP


  • clue/reactphp-zenity Обертка над Zenity для создания GUI приложений на PHP. Работает из коробки на Ubuntu.

Материалы для обучения



Аудио/Видео



Занимательное




Сегодня первый раз проведу стрим по PHP дайджесту. Все новости и ссылки из выпуска + больше деталей, обзор присланного, интересное но не вошедшее в выпуск, и конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.



Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 193
Подробнее..

PHP-Дайджест 195 (14 28 декабря 2020)

28.12.2020 12:07:24 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: Fibers для асинхронного PHP, первые нативные атрибуты, короткий match и другие RFC предложения для PHP 8.1, инструменты, много видео, статьи и подкасты.
Приятного чтения и с наступающим Новым годом!



PHP Internals


  • [RFC] Fibers Большое предложение по асинхронному PHP. Подробнее было в телеграм-канале. Если коротко, то это улучшенная версия генераторов, которая позволит писать асинхронный код на основе библиотек типа ReactPHP / Amp гораздо проще и понятнее.


    Amp v3 еще находится в разработке, но уже использует файберы вместо промисов. Вот пример как выглядит аналог async/await:
    use Amp\Delayed;use Amp\Loop;use function Amp\async;use function Amp\await;// Обратите внимание, что замыкание объявляет int возвращаемым типом, а не промис или генератор, но при этом исполняется как корутина.$callback = function (int $id): int {    return await(new Delayed(1000, $id)); // Await promise resolution.};// Вызов $callback возвращает int, but is executed asynchronously.$result = $callback(1); // Вызывает корутину внутри этого зеленого потока, занимает 1 секунду.\var_dump($result);// Одновременно запускает два новых зелёных потока, ждет их результата в этом основном зелёном потоке.$result = await([  // Выполняется одновременно, вызов займет только 1 секунду.    async($callback, 2),    async($callback, 3),]);\var_dump($result); // Выполнится через 2 секунды после старта всего скрипта.
    
  • [RFC] #[Deprecated] Attribute В PHP 8 добавлена поддержка атрибутов, но без самих атрибутов. Предложен первый официальный атрибут это #[Deprecated] для пометки устаревших методов и функций. Если вызвать функцию или метод, которые помечены атрибутом #[Deprecated], то PHP выбросит ошибку уровня E_DEPRECATED.

    Устаревшие классы, свойства, константы пока нельзя будет пометить таким атрибутом.

    Аналогичный, но чуть более продвинутый атрибут уже есть в PhpStorm 2020.3. Кроме отметки, он предлагает еще и вариант замены. Правда, из-за того что нативный атрибут может быть только final, пока неясно как красиво использовать оба.
  • [RFC] #[NamedParameterAlias] Attribute Еще одна идея атрибута для PHP 8.1.

    Во время обсуждения и голосования за именованные аргументы, был один наиболее спорный момент это проблемы обратной совместимости при переименовании. Разработчики библиотек справедливо указывали на то, что имена параметров публичных методов теперь станут часть API и их нельзя будет легко изменить.

    На эту тему даже обсуждался отдельный RFC: Named Parameters explicit opt in.

    Теперь предлагается более простое и понятное решение Добавить атрибут для параметров, в котором можно указывать алиас, то есть альтернативное имя.
    <?phpuse NamedParameterAlias;// Old function signature:function log($arg1) {}// New function signature introduces better namefunction log(#[NamedParameterAlias("arg1")] $message) {}log(arg1: "Hello World!");log(message: "Hello World!");
    
    Пока открытый вопрос будет ли добавлен флаг Attribute::IS_REPEATABLE. Если да, то можно будет добавить сколько угодно алиасов для параметра.
  • [RFC] Short match Выражение match в PHP 8 предлагается как альтернатива switch.

    Иногда можно встретить код вида switch(true) { ... , вместо цепочки if-elseif-...else. В таком же стиле можно использовать и match(true).

    Данный RFC предлагает сделать условие в match необязательным а поведение match(true) дефолтным.
    В PHP 8.0:
    $a = 3;print match (true) {  $a < 2 => 'small',  $a == 3 => 'medium',  default => 'large',};
    
    Предлагается:
    $a = 3;print match {  $a < 2 => 'small',  $a == 3 => 'medium',  default => 'large',};
    
    В обсуждении много критики на тему избыточности такого сахара.
  • [RFC] Configurable callback to dump results of expressions in `php -a` Tyson Andre предлагает добавить возможность задавать колбэк отрабатывающий на вывод из интерактивного шелла php -a.

    В отличие от bobthecow/psysh, встроенный в PHP шелл умеет корректно обрабатывать фатальные ошибки. Так что данное улучшение может быть полезным для других шеллов.
  • [RFC] Add is_list(mixed $value): bool Еще один RFC от Tyson Andre. Предлагается добавить функцию is_list(), которая вернет true, если передать в нее массив с последовательными целочисленными ключами 0, 1, 2 ... count($value)-1.
  • [PR] Add support for property initialization during cloning В этом пул-реквесте представлена реализация небольшого улучшения синтаксиса для клонирования иммутабельных объектов.
    Скрытый текст
    class Foo{    public $bar;    public $baz;    public function withProperties($bar, $baz)    {        $self = clone $this;        $self->bar = $bar;        $self->baz = $baz;        return $self;    }}class Foo{    public $bar;    public $baz;    public function withProperties($bar, $baz)    {        return clone $this with {            bar: $bar,            baz: $baz,        };    }}
    

Инструменты


  • Rector 0.9 Инструмент для автоматических рефакторингов и обновления кода, например, на PHP 8.
  • FriendsOfPHP/proxy-manager-lts Форк популярного пакета Ocramius/ProxyManager/ с расширенной обратной совместимостью и поддержкой PHP >=7.1.
  • fullpipe/check-them Проверка внешних сервисов на доступность. Прислал fullpipe1.
  • multiavatar/multiavatar-php Скрипт позволяет генерировать забавные аватары для пользователей по их юзернейму (строке). Например для 'php':
  • dantleech/maestro2 Менеджер PHP-репозиториев как ansible только для PHP пакетов. Пример использования для миграции на GitHub Actions. Пост в поддержку.
  • matomo-org/matomo 4.0 Открытый аналог Google Analytics реализованный на PHP. Ранее известен как Piwik.
  • jolicode/JoliNotif Пакет для отправки уведомлений на рабочий стол из PHP-скрипта. Работает с Win, macOS, Linux.
  • skrtdev/NovaGram Библиотека с простым API для создания Телеграм-ботов.

Symfony



Laravel



Yii


  • Yii 2.0.40
  • yiisoft/test-support Пакет предназначен для упрощения тестирования элементов, зависящих от PSR-интерфейсов.

Статьи



Сообщество



Видео



Занимательное






Сегодня будет второй стрим по PHP Дайджесту. Все новости и ссылки из выпуска + больше деталей, обзор присланного, интересное но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.



Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP Дайджест 194
Подробнее..

PHP Дайджест 196 (1 11 января 2021)

11.01.2021 14:11:20 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: релиз PHP 8.0.1, MySQL движок на PHP от Vimeo и другие релизы, обновленный Enum и свежие предложения для PHP 8.1, уязвимость в Laminas, инструменты, статьи, видео, PHP Дайджест Live в 20:00 МСК.

Приятного чтения!



Новости и релизы



PHP Internals


  • [RFC] Enumerations, Round 2 Предложение по Enum для PHP было сильно доработано. В частности: кейсы (значения) не могут иметь методы или константы, а сам Enum может; поддерживаются трейты без свойств; в скалярных енамах вместо метода value() теперь просто свойство. Обзор предложения был в выпуске 194 и на стриме.
  • [RFC] Bundling ext/simdjson into core Автор предлагает забандлить в ядро PHP библиотеку simdjson. Оно в разы быстрее чем текущее ext/json и позволяет парсить гигабайтные json за секунды.

    В обсуждении указали на то, что библиотека молодая и не доступна во многих инсталяциях. Поэтому пока лучше предоставлять ее в виде PECL расширения, а забандлить позже.
  • [RFC] Array unpacking with string keys В PHP 5.6 была добавлена распаковка массива в аргументах:
    variadic_function(...['apple', 'banana', 'lemon']);
    

    А в PHP 7.4 то же самое в массивах:
    $parts = ['apple', 'pear'];$fruits = ['banana', 'orange', ...$parts, 'watermelon'];// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
    

    Но оба случая не поддерживали массивы со строковыми ключами. И поскольку с добавлением именованных аргументов в PHP 8.0 уже решен первый случай, то теперь нет причин сохранять ограничение для второго.

    В PHP 8.1 предлагается разрешить распаковку массивов со строковыми ключами:
    $array1 = ['a' => 'apple', 'p' => 'pear'];$array2 = ['b' => 'banana', 'o' => 'orange'];$array = [...$array1, ...$array2];// Приблизительно то же самое что:$array = array_merge($array1, $array2);
    
  • [PR] Use 'ENT_QUOTES|ENT_SUBSTITUTE' for HTML encoding and decoding functions Автор пул-реквеста заметил, что функция htmlspecialchars() почти всегда используется с флагами ENT_QUOTES и ENT_SUBSTITUTE:

    ENT_QUOTES WordPress
    ENT_QUOTES Blade (Laravel)
    ENT_QUOTES | ENT_SUBSTITUTE Twig (Symfony or Slim)
    ENT_QUOTES | ENT_SUBSTITUTE CodeIgniter
    ENT_QUOTES | ENT_SUBSTITUTE CakePHP
    ENT_QUOTES | ENT_SUBSTITUTE Yii
    Предлагается сделать эти флаги включенными по умолчанию.
  • check[RFC] Restrict $GLOBALS usage Принято единогласно. Использование $GLOBALS начиная с PHP 8.1
    будет ограничено
    Продолжат работать чтение, запись, isset и unset:
    $GLOBALS['x'] = 1;echo $GLOBALS['x']isset($GLOBALS['x']);unset($GLOBALS['x']);
    

    А вот попытка изменить саму переменную $GLOBALS вызовет ошибку:
    $GLOBALS = [];$GLOBALS =& $x;$x =& $GLOBALS;unset($GLOBALS);
    

    Также ошибка будет, если передать $GLOBALS по ссылке в функцию:
    asort($GLOBALS);// > Compile-time error
    

    Все это упрощает внутренности PHP и улучшает производительность операций с массивами в PHP.

  • [RFC] Concepts to improve mysqli extension Рекомендованным механизмом для доступа к БД в PHP является PDO. Тем не менее во многих приложениях используется mysqli. У последнего есть ряд старых проблем, которые автор и предлагает решить.
  • [RFC] Add array_is_list(array $array): bool Стартовало голосование по добавлению функции, которая вернет true, если передать в нее массив с последовательными целочисленными ключами 0, 1, 2 ... count($value)-1. Функция переименована из is_list() в array_is_list(). О причинах было подробнее на стриме.

    В Symfony уже успели сделать полифил для PHP 8.1 с этой функцией.
  • В PHP 8.1 добавлены супербыстрые алгоритмы хеширования: xxHash и MurmurHash3.

Инструменты


  • dollarDump Debugging Evolved Ray Ребятки из Spatie представили свое приложение для отладки Ray. Добавляете вызовы ray($anything) в своем коде, и при запуске PHP-скрипта оно красиво отображается в отдельном десктопном приложении.

    Если вы осилили Xdebug, то вряд ли это имеет смысл. А если отлаживаете в стиле var_dump(...)/die(), то может быть интересно.

    Смотрите подробный videoвидеообзор на английском или на русском в ближайшем PHP Дайджест Live.
  • AdamGaskins/barcoder Пакет с лаконичным интерфейсом для генерации SVG-картинок штрихкодов (QR, Datamatrix, и т.п.).
  • vimeo/php-mysql-engine MySQL движок на чистом PHP. Пригодится, если при тестировании вы обращаетесь к базе и хотите ускорить запуск тестов, эмулируя MySQL в памяти. Библиотека расширяет класс PDO и позволяет вызывать обычные методы PDO MySQL. Аккуратно: есть ограничения.
  • jvoisin/snuffleupagus PHP-расширение блокирует запуск потенциально небезопасного кода в рантайме и избавляет от многих потенциальных уязвимоcтей. Изначально разработан для хостеров, которые, естественно, не могут редактировать код своих клиентов, но хотят сделать его безопаснее.
  • mbunge/php-attributes Пакет для автоматического резолва/инициализации атрибутов PHP 8. Можно просто подключить автозагрузчик или использовать резолвер вручную.
  • mlocati/docker-php-extension-installer Инструмент упрощает установку PHP-расширений в Docker.
  • php-opencv/php-opencv Расширение для компьютерного зрения (распознавание лиц, объектов, и т. п.) и машинного обучения теперь с поддержкой PHP 8. Примеры использования.

Symfony



Laravel



Yii



Zend / Laminas


  • Итоги 2020 для Laminas Project
  • В Zend Framework / Laminas зарепортили уязвимость Суть уязвимости можно понять из этого примера:
    class MyClassWithToString {    public $name;    public function __construct($name) {        $this->name = $name;    }    public function __toString() {        return (string) $this->name;    }}$input = unserialize('O:19:"MyClassWithToString":1:{s:4:"name";s:15:"/tmp/etc/passwd";}');if ($input instanceof MyClassWithToString) {    unlink($input);}
    

    Во фреймворк запушили исправление с проверкой на is_string() перед тем как делать unlink(). Но если посмотреть внимательнее, то уязвимость касается десериализации данных от пользователя. А на php.net красным написано, что не стоит использовать unserializie() в подобных случаях.

    Более того, с 2017 года ошибки десериализации больше не считаются ошибками безопасности, просто потому что unserialize() никогда не будет безопасным (не только в PHP).

    Вот еще свежий пост об эксплуатации подобных багов на примере Yii.

Async PHP


  • Swoole PHP 4.6.0 В свежем релизе асинхронного движка добавлен нативный асинхронный сURL.
  • amphp/mysql-dbal Концепт асинхронного драйвера для Doctrine DBAL/ORM на базе Amphp v3.

Статьи



Аудио/Видео



Сообщество







Сегодня будет третий стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и деталями, обзор присланного, интересное но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.



Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP Дайджест 195
Подробнее..

PHP Дайджест 197 (11 25 января 2021)

25.01.2021 12:19:59 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: объекты в качестве ключей массивов и другие RFC предложения для PHP 8.1, запуск WebAssembly в PHP, о коллизиях в массивах, порция полезных инструментов, статьи, видео, PHP Дайджест Live.

Приятного чтения!



Новости и релизы



PHP Internals


  • [RFC] Object keys in arrays
    Никита предлагает сделать возможным использование объектов в качестве ключей обычных массивов.

    $obj1 = new stdClass;$obj2 = new stdClass;$array = [];$array[$obj1] = 1;$array[$obj2] = 2;var_dump($array[$obj1]); // int(1)var_dump($array[$obj2]); // int(2)
    

    Сейчас для этого можно использовать SplObjectStorage или WeakMap, и они будут вести себя как массивы. Но все равно останутся ограничения. Например, их нельзя использовать в функциях array_* и многих других стандартных.

    Если предложение будет принято, то это также в будущем упростит добавление других видов ключей, например, целых чисел произвольной точности.

    Поводом для предложения послужил тот факт, что в RFC Enumerations предлагается сделать значения енамов объектами. И соответственно тогда их нельзя будет использовать в качестве ключей массивов. А это существенный минус.
  • [RFC] Object scoped RNG Implementations
    Функции для генерации псевдослучайных чисел rand() или mt_rand() будут генерировать одну и ту же последовательность для одинакового посевного (seed) значения srand(). Но из-за использования глобального состояния невозможно создать несколько генераторов с разными посевными значениями и использовать их одновременно.

    Автор предлагает добавить объектный API для работы с генераторами псевдослучайных последовательностей, чтоб решить проблему глобального состояния.
    $seed = 1234;$rng = new RNG\MT19937($seed);$array = [1, 2, 3, 4, 5];shuffle($array, $rng); // Результат всегда стабильный
    
    Если нужны криптографически стойкие случайные числа, то есть, которые устойчивы к атакам, то следует использовать: random_bytes() или random_int().
  • [RFC] var_representation(): readable alternative to var_export()
    Функция var_export(), которая выводит набор выражений в строку, давно была предметом жалоб. Как минимум был RFC с предложением сменить синтаксис массива с array( ) на [ ].

    Теперь же предлагается просто ввести новую функцию var_representation($value, int $flags=0) :string, которая исправит все недостатки var_export().

    В качестве альтернативы пока можно использовать brick/varexporter.
  • [RFC] Change Default mysqli Error Mode
    В рамках инциативы по улучшению расширения mysqli (подробнее было в PHPLive#3 ) предлагается первый шаг: сделать режим бросания исключений в случае ошибки дефолтным. То есть это как если сейчас в приложении добавить вызов: mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Из крупного опенсорса mysqli используют только CodeIgniter и WordPress.
  • [RFC] Dump results of expressions in `php -a` На голосовании предложение по улучшению интерактивного шелла php -a.
  • PHP 8.1: What's New and Changed На php.watch можно следить за тем, как будет выглядеть PHP 8.1. На сайте собраны все принятые RFC и важные пул-реквесты с описаниями.

Инструменты


  • fabpot/local-php-security-checker Проверяет composer.json на предмет наличия зависимостей с известными уязвимостями. В качестве базы уязвимостей используется FriendsOfPHP/security-advisories.

    Можно использовать готовый GitHub action или Docker-образы от oxcom.
  • funivan/PhpClean Плагин для PhpStorm, который добавляет пачку интересных инспекций, например, чтоб везде были объявлены типы, не было лишних комментариев, и использовалась композиция вместо наследования. Отличный пост в поддержку.
  • wasmerio/wasmer-php WebAssembly рантайм для PHP. Расширение позволяет запустить и использовать любой wasm-бинарник из PHP. То есть можно взять библиотеку на Rust, скомпилировать в wasm и использовать на любой платформе из PHP. При этом с очень высокой производительностью. Подробнее в посте автора.
  • temporalio/sdk-php Антон Титов и Кирилл Несмеянов готовят PHP-SDK для temporal.io распределенный, масштабируемый, отказоустойчивым, высокодоступный движок, для выполнения процессов бизнес-логики.

    Пример реализации накопительной транзакции т.е. перевести деньги продавцу от нескольких покупателей в течении какого-то периода времени:
    Скрытый текст
    #[Workflow\WorkflowInterface]class LoopWorkflow{    private array $values = [];    private array $result = [];    private $simple;    public function __construct()    {        $this->simple = Workflow::newActivityStub(            SimpleActivity::class,            ActivityOptions::new()->withStartToCloseTimeout(5)        );    }    #[SignalMethod]    public function addValue(        string $value    ) {        $this->values[] = $value;    }    #[WorkflowMethod(name: 'LoopWorkflow')]    public function run(        int $count    ) {        while (true) {            yield Workflow::await(fn() => $this->values !== []);            $value = array_shift($this->values);            $this->result[] = yield $this->simple->echo($value);            if (count($this->result) === $count) {                break;            }        }        return $this->result;    }}
    

    Под капотом RoadRunner, reactphp/promise, атрибуты PHP 8. Подробнее на стриме расскажет сам автор, Антон Титов.

Symfony



Laravel



Yii



Async PHP


  • walkor/Workerman Асинхронный движок с простым API, поддержкой HTTP, WebSocket, SSL. Может работать в связке с libevent.

    Самый быстрый фреймворк на PHP в бенчмарках the-benchmarker/web-frameworks, в частности, потому что умеет из коробки стартовать пачку воркеров.

    Также на его базе есть реализация socket.io сервера walkor/phpsocket.io, адаптер PSR-7,15,17 chubbyphp/chubbyphp-workerman-request-handler, и фреймворк gotzmann/comet.

Статьи



Аудио/Видео



Сообщество


  • habrЭто не легаси-код, это PHP.
  • Буря в стакане по поводу PHP 8 В декабре был пост от @jrf_nl, в котором автор жаловалась, что в PHP 8 слишком много обратно несовместимых изменений и обновиться очень сложно.
    Эту идею подхватил и Зеев Сураски, который играл одну из ключевых ролей в развитии PHP в период 1997-2017.


    В ответ Brent Roose написал свой пост и разложил, почему проблема преувеличена, а обновляться не страшно и лучше делать это регулярно.

    Хотя доля правды в словах Зеева и других есть. Потому что иногда миграция может быть неочевидной. Например, вот такой код никогда не вызывал ни ошибок ни депрекейшн ноутисов, а в PHP 8.0 отвалится с TypeError:

    var_dump(round("foo"));
    
    3v4l.org/pU0LD

    Или вот еще неочевидный, хоть и задокументированный, пример из слайдов:
    $sub = substr('abcdef', 4, -4);if ($sub === false) {    echo 'fail';} else {    echo 'do something with $sub';}// PHP 5-7 > 'fail'// PHP 8   > 'do something with $sub'
    
    3v4l.org/Ln9g3

    В тему хороший ресурс по обновлению и поддержке легаси кода: understandlegacycode.com.
  • Как выглядел бы PHP, если бы это зависело от меня Подборка желанных фич от Brent Roose: final и void по умолчанию, никакого mixed, параметры и свойства обязательно типизированные, дженерики, куда ж без них, енамы, объекты для скаляров.





Сегодня будет четвертый стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и интересными деталями, не вошедшими в текстовый выпуск. В гостях Антон Титов с рассказом про новый инструмент. А также результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.



Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 196
Подробнее..

PHP Дайджест 198 (25 января 8 февраля 2021)

08.02.2021 04:16:37 | Автор: admin
Фото: Иван Ганцев.

Обновление стандартов PSR-6 и PSR-13, кеширование наследования в опкеш, аксессоры свойств и другие новости из PHP Internals, диалект Lisp компилируемый в PHP, а также инструменты, видео, подкасты и PHP Дайджест Live.

Приятного чтения!



Новости и релизы



PHP Internals


  • [RFC] Warning for implicit float to int conversions
    PHP динамический язык, что значит он может менять тип переменной на лету. У такого подхода есть как плюсы, так и минусы.

    Например, при преобразовании вещественных чисел (float) в целые (int) тихо теряется дробная часть.
    var_dump(3.1415, (int) 3.1415);> float(3.1415)> int(3)
    
    3v4l.org/fP1aC

    В данном RFC предлагается бросать предупреждение, если делается такое преобразование и дробная часть у float ненулевая.
  • Inheritance Cache
    Дмитрий Стогов представил PR, в котором реализовал кеширование наследования.

    Кеш на 8% улучшает производительность Hello World приложения на Symfony. И чтоб получить этот прирост, ничего делать не надо будет. Просто обновить PHP и удостовериться, что включен опкеш. Браво, Дмитрий!
    Скрытый текст
    Классы PHP компилируются и кешируются в opcache, но их связывание происходит во время выполнения при каждом запросе. Этот процесс может потребовать проведения ряда проверок на совместимость и заимствования методов/свойств/констант из родительских классов или трейтов. Все это требует много времени, хотя результат один и тот же в каждом запросе.

    Кэш наследования выполняет связывание набор всех зависимых классов (родительских, интерфейсов, трейтов, тип свойств, и т.п.) один раз и сохраняет в опкеше.

    Кроме того, в рамках этого патча Дмитрий удалил ограничения для неизменяемых классов. И теперь все классы, хранящиеся в опкеше иммутабельны.
  • [RFC] Property Accessors ! ранний черновик !
    Никита создал черновик предложения по аксессорам, то есть возможности объявлять геттеры/сеттеры для каждого свойства отдельно.

    Во-первых, RFC предполагает возможность объявлять асимметричные модификаторы доступа:
    class User {    public string $name { get; private set; }    // или вот так    public string $prop { public get; private set; }}
    

    Также рид-онли свойства:
    class Test {    // Read-write property.    public $prop { get; set; } // равносильно `public $prop;`    // Read-only property.    public $prop { get; }}
    

    Во-вторых, добавлять валидацию с помощью ключевого слова guard.
    class User {    public string $name {        guard {            if (strlen($value) === 0) {                throw new ValueError("Name must be non-empty");            }        }    }}
    

    В-третьих, ленивую инициализацию с помощью ключевого слова lazy:
    class Test {    public string $somethingExpensive {        lazy {            return computeSomethingExpensive();        }    }}
    

    В 2013 году подобное предложение уже обсуждалось для PHP 5.5, но провалилось на голосовании.

    Пока это супер ранний черновик, который даже не обсуждался в Internals. На первый взгляд, предложение в текущем виде получается слишком сложным и, возможно, не стоит того. Но черновик просочился даже до публикации, так что посмотрим как он еще изменится.
  • [RFC] Fibers Продолжается активное обсуждение файберов. Из интересного: к дискуссии подключился один из мейнтейнеров Swoole:
    Once PHP has a stack coroutine like Fiber, we can do more than what we can do now. Since we can interrupt from PHP internal functions, then we can replace all the implementation of PHP blocking functions, such as sleep(), and we can also replace php_stream so that we can change the implementation of PDO, mysqli, and phpredis into a coroutine way, and we can also make curl become a coroutine version through libcurl's support for multiplexing.
  • [RFC] Enumerations Стартовало голосование по енамам. Подробнее о предложении можно прочитать в дайджесте 194 или посмотреть в видео дайджест-лайва.
  • [RFC] var_representation(): readable alternative to var_export() Стартовало голосование по добавлению новой функции, которая исправляет проблемы старой var_export().
  • cross[RFC] Dump results of expressions in `php -a` Отклонено.
  • Что нового в PHP 8.1 Пополняющийся пост от Brent Roose. Если хочется прям все-все в подробностях, то лучше смотреть на php.watch.

    Следить за новыми RFC и ходом голосований также можно на PHP RFC Watch

Инструменты


  • vimeo/php-mysql-engine Симулятор MySQL-запросов (движок) на чистом PHP. В посте про инструмент Matt Brown, автор Psalm, рассказывает, как внедрение этого движка ускорило запуск тестов в Vimeo в два раза.

    На стриме возник вопрос: чем это лучше использования SQLite?

    Простой бенчмарк от Валентина Удальцова (канал Пых) показывает, что инструмент Vimeo заметно медленнее, чем PDO('sqlite::memory:'):
    sqlite:           4.00 MiB  - 66 msphp-mysql-engine: 10.00 MiB - 330 ms
    

    Поэтому, если для приложения достаточно подмножества SQLite, то можно остановиться на нем.
  • cweagans/composer-patches Плагин для Cоmposer, который позволяет применять патчи к зависимостям. Удобно, если ваши изменения специфичные и не имеют смысла в виде полноценного PR для пакета/фреймворка, и на целый форк не тянут.
  • OndraM/ci-detector Позволяет определить используемый CI-сервер и получить данные о билде.
  • rakibtg/SleekDB NoSQL база данных на PHP. Данные хранятся в JSON-документах и есть язык запросов
  • Orangesoft-Development/throttler Балансировщик нод. Пример использования для выбора прокси для Guzzle. Прислал Александр Денисюк.
  • sunrise-php/awesome-skeleton Микрофрейморк на компонентах для разработки микросервисов и запуске на RoadRunner или Swoole. Прислал fenric.

Symfony



Laravel



Yii



Статьи



Аудио/Видео



Занимательное


  • Phel Функциональный язык программирования, который компилируется в PHP. Является диалектом Lisp и вдохновлен Clojure. Пример кода:
    Скрытый текст
    # Define a namespace(ns my\example)# Define a variable with name "my-name" and value "world"(def my-name "world")# Define a function with name "print-name" and one argument "your-name"(defn print-name [your-name]  (print "hello" your-name))# Call the function(print-name my-name)
    



Уже пятый выпуск стрима по мотивам PHP Дайджеста будет сегодня на YouTube-канале PHP Point. Разбор новостей и ссылок из выпуска с подробностями и деталями. Новый ведущий, гость в выпуске, и по традиции конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.



Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 197
Подробнее..

PHP Дайджест 199 (8 22 февраля 2021)

22.02.2021 14:21:33 | Автор: admin

В PHP 8.1 будет enum, и еще два принятых, два отклоненных и три новых RFC предложения для PHP 8.1. WordPress используется на 40% сайтов. Почему нужно убрать strict_types, почему не стоит использовать empty(), а также инструменты, видео, статьи, подкасты, и PHP Дайджест Live в 20:00 МСК.

Приятного чтения!



Новости и релизы



PHP Internals


  • check[RFC] Enumerations
    С результатом 44 против 7 голосование завершено. В PHP 8.1 будет enum.
    enum RfcStatus {    case Draft;    case UnderDiscussion;    case Accepted;}function setRfcStatus(RfcStatus $status) :void {    // ...}setRFCStatus(RfcStatus::Accepted); // ОкsetRFCStatus('Draft');             // TypeError
    

    Подробнее про инамы можно прочитать в пересказах RFC в статье Брента и еще подробнее на php.watch.

    В Symfony уже открыли тикеты для добавления поддержки инамов.
  • check[RFC] Deprecate passing null to non-nullable arguments of internal functions
    В текущих версиях PHP стандартные функции без ошибок принимают null в качестве аргумента, когда параметр не nullable.

    А начиная с PHP 8.1 встроенные функции тоже будут бросать TypeError. Например, str_contains("", null). 3v4l.org/OVoa0A.

    Интересный факт: предложение принято единогласно, притом что это довольно крупная поломка обратной совместимости в PHP.
  • check[RFC] Array unpacking with string keys
    Предложение принято и в PHP 8.1 будет работать распаковка любых массивов, в том числе со строковыми ключами:
    $array1 = ['a' => 'apple', 'p' => 'pear'];$array2 = ['b' => 'banana', 'o' => 'orange'];$array = [...$array1, ...$array2];// Приблизительно то же самое что:$array = array_merge($array1, $array2);
    
  • [RFC] Fibers
    Из предложения по файберам был убран планировщик, потому что он сильно усложнял реализацию и вероятность принятия предложения.

    Теперь Fiber API предоставляет самый минимум и похож на аналогичные возможности в Ruby.

    Пример использования с ReactPHP trowski/react-fiber:
    Скрытый текст
    $loop = new FiberLoop(Factory::create());$browser = new Browser($loop);$request = function (string $method, string $url) use ($browser, $loop): void {    /** @var Response $response */    $response = $loop->await($browser->requestStreaming($method, $url));    /** @var ReadableStreamInterface $stream */    $stream = $response->getBody();    $body = $loop->await(Stream\buffer($stream));    var_dump(\sprintf(        '%s %s; Status: %d; Body length: %d',        $method,        $url,        $response->getStatusCode(),        \strlen($body)    ));};$requests = [];$requests[] = $loop->async($request, 'GET', 'https://reactphp.org');$requests[] = $loop->async($request, 'GET', 'https://google.com');$requests[] = $loop->async($request, 'GET', 'https://www.php.net');$loop->await(Promise\all($requests));
    
  • [RFC] CachedIterable (rewindable, allows any key&repeating keys)
    Tyson Andre предлагает добавить кеширующий итератор. Он сохраняет состояние любого итератора и внутри себя содержит иммутабельные копии его ключей и значений.
  • Proposal: namespace the SPL
    Обсуждается предложение создать неймспейс Spl и создать в нем алиасы для существующих классов: Spl\FixedArray -> SplFixedArray. А все новые классы, такие как CachedIterable и ReverseIterator уже вносит сразу в новый неймспейс.

    А пока в качестве альтернативы есть отличный инструмент azjezz/psl.
  • [RFC] mysqli bind in execute
    Kamil Tekiela продолжает инициативу по улучшению mysqli. В этом RFC предлагает добавить новый необязательный параметр в mysqli_stmt::execute(). Он будет принимать массив значений, которые автоматически биндятся, вместо отдельного вызова mysqli_stmt::bind_param(). В последний сейчас принимает только переменные по ссылке.
  • cross[RFC] PHP\iterable\any() and all() on iterables Предложение добавить функции any() и all() для итераторов не прошло голосование.
  • cross[RFC] var_representation(): readable alternative to var_export() Идея добавить альтернативу для var_export не нашла поддержки, поэтому пока используем юзерленд альтернативу brick/varexporter.
  • [Draft] Unify PHP's typing modes В PHP по сути есть два режима типизации. Один слишком слабый, а другой, strict_types=1 слишком строгий. Этот документ описывает причины существования этих двух режимов, их недостатки и что нужно сделать, чтобы объединять оба режима.

    Документ написан George Peter Banyard, и пока он не планирует его выдвигать в качестве официального RFC.

    Разберем его положения на стриме.
  • Об Observer API в PHP 8 Статья о внутреннем API для отслеживания входа и выхода из функции. Он существенно упростил разработку расширений типа Xdebug, профайлеров и APM-решений New Relic, Tideways, и т.п.

Инструменты


  • renoki-co/php-k8s Позволяет управлять ресурсами кубернетиса из PHP.
  • marcocesarato/php-conventional-changelog Генерирует с changelog из сообщений коммитов.
  • andrey-helldar/package-wizard CLI-инструмент для создания начальной структуры пакетов.
  • rryqszq4/ngx_php7 Встраиваемый в nginx интерпретатор PHP. Позволяет создавать обработчики запросов на PHP, модифицировать запрос/ответ, фильтровать тело ответа и заголовки, и прочее.

Symfony



Laravel



Yii



Async PHP


  • swow/swow Расширение для PHP, которое предоставляет асинхронные возможности на базе libuv, включая асинхронный стрим, то есть из коробки работающие PDO, file_get_сontents() и т.п. (когда они обернуты в корутину). По сути, является минималистичным подмножеством Swoole.

phpstorm PhpStorm



Статьи



Аудио/Видео



Занимательное


  • mario-deluna/php-render 3D рендерер на чистом PHP, даже безШейде Шейдеры, парсер .obj файлов и прочее.
    Код примера:





Уже традиционный стрим по мотивам PHP Дайджеста. Будет разбор новостей и ссылок из выпуска с подробностями и дополнительными деталями.
Начало в 20:00 Москва, Минск / 19:00 Киев.



Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 198
Подробнее..

PHP Дайджест 200 (22 февраля 15 марта 2021)

15.03.2021 18:04:43 | Автор: admin
Фото: Grgoire Gaonach

Свежая подборка со ссылками на новости и материалы. В выпуске: Объекты в инициализаторах, неймспейсы для расширений, и другие RFC предложения для PHP 8.1. Обновлен PSR-11, предложен PSR ClockInterface. Порция полезных инструментов, видео, подкасты, статьи, и PHP Дайджест Live в 20:00 МСК.

Приятного чтения!



Новости и релизы



PHP Internals


  • [RFC] New in initializers
    В текущих версиях PHP можно использовать только константные значения в инициализаторах, то есть в дефолтных значениях свойств, параметров, констант. Если нужно не константное значение, то свойства инициализируют в конструкторе, а аргументы в теле методов. С константами таких вариантов сейчас вообще нет.

    Никита Попов предлагает сделать возможным использовать объекты в качестве дефолтных значений свойств, параметров, а также для любых констант и статических переменных.

    static $x = new Foo();const C = new Foo();#[AnAttribute(new Foo())]class Test {    public const C = new Foo();    public static $prop = new Foo();    public $prop = new Foo();    public function __construct(        private Logger $logger = new NullLogger()    ) {}}function test($param = new Foo()) {}
    

    Пока предложение ограничивается только оператором new, но реализация позволяет в будущем расширить для любых выражений.

    Документ содержит много подробностей и нюансов. Например, как работает рефлексия, трейты, анонимные классы, использование в атрибутах для решения проблемы вложенности, и прочее. Рассмотрим подробнее на стриме PHP Дайджест Live.
  • [RFC] Namespaces in bundled PHP extensions
    Классы и функции, предоставляемые в PHP, в настоящее время находятся в глобальном пространстве имен. Идея почистить и распределить все по неймспейсам обсуждалась давно.

    В данном RFC предлагается отказаться от префиксов вендоров, в том числе PHP. А неймспейсами должны стать имена расширений. То есть класс OpenSSLCertificate станет OpenSSL\Certificate.

    Пока правда, это касается только новых символов, а миграция существующих в рамках этого RFC не затрагивается. Но в примерах приведены возможные трансформации:
    str_contains() -> String\contains()
    in_array() -> Array\contains().
    Звучит как идея для PHP 9.
  • [RFC] Static variables in inherited methods
    Допустим, есть метод, в котором используется статическая переменная. Если отнаследоваться от класса с этим методом, то для наследника эта статическая переменная будет новой.

    RFC предлагает сделать единственным набор статических переменных для метода, независимо от того наследуется он или нет.
    Скрытый текст
    class A {    public static function counter() {        static $i = 0;        return ++$i;    }}class B extends A {}var_dump(A::counter()); // int(1)var_dump(A::counter()); // int(2)var_dump(B::counter()); // int(3)var_dump(B::counter()); // int(4)
    

  • [RFC] Fibers
    Стартовало голосование по файберам. Подробнее о том, что это было на канале. Если коротко: это небольшое, но важное улучшение генераторов, которое позволит писать асинхронный код на PHP проще. Например, вот так:

    Среди голосовавших против трое мейнтенеров Swoole. Они считают, что в Swoole уже пройден весь путь по асинхронному PHP, а файберы это попытка начать заново, и их добавление не несет пользы без других компонентов.

    Также против голосовал Joe Watkins, так как по его мнению файберы не обеспечивают использование по полной всем тем, что сегодня может предложить хард/софт. В то время как расширение krakjoe/parallel вполне могло бы.

    Здравое зерно в этих рассуждениях есть, и тем не менее, файберы реальный шаг в сторону асинхронных возможностей, который не противоречит ни Swoole ни parallel.
  • [RFC] noreturn type
    Авторы Psalm и PHPStan предлагают добавить новый тип в PHP noreturn.

    Такой тип указывает на то, что функция либо всегда бросает исключение либо завершает выполнение, то есть вызывает exit(), die(), trigger_error().

    function redirect(string $uri): noreturn {    header('Location: ' . $uri);    exit();}function redirectToLoginPage(): noreturn {    redirect('/login');}
    

    Подобный тип есть в Hack, в Python, уже давно используется в самих Psalm, PHPStan и в PhpStorm в виде атрибута #[NoReturn] или через exitpoint в .phpstormmeta.php.
  • [RFC] debug_backtrace_depth(int $limit=0): int Предлагается новая функция debug_backtrace_depth(int $limit=0), которая возвращает текущий уровень глубины стека вызовов. Может быть полезно для отладки рекурсивных функций, например.

    Сейчас можно получить такое же поведение с помощью полифила: count(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $limit=0)).
  • [RFC] println(string $data = ''): int Предлагается добавить функцию println, которая выведет строку в stdout и завершит ее символом новой строки. Не str_contains(), конечно, но тоже занятно.

Инструменты



Symfony



Laravel



Yii



Статьи



Видео



audio Подкасты



Сообщество





После небольшого перерыва возвращаемся со стримом и ведущим Валентином Удальцовым!

Будет разбор новостей и ссылок из выпуска с подробностями и деталями, мнение Валентина по RFC и статьям. Интересное но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.

Начало в 20:00 Москва, Минск / 19:00 Киев.


Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 199
Подробнее..

PHP Дайджест 201 (15 29 марта 2021)

29.03.2021 12:16:08 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: все про файберы и асинхронный PHP, а также новые лямбды, пересечения типов и другие предложения для PHP 8.1. Ближайшие мероприятия, порция полезных инструментов, статьи, подкасты, видео и PHP Дайджест Стрим.

Приятного чтения!



Новости



Async PHP


  • [RFC] Fibers Файберы будут в PHP 8.1

    После долгих обсуждений и споров с мейнтейнерами Swoole предложение по файберам наконец-то принято.

    Файбер это блок кода, у которого есть свой стек (переменные и состояние). Он может быть запущен, приостановлен или прерван полностью в любой момент из основного кода или другого файбера. Их можно применить для реализации зеленых тредов в PHP.

    Скрытый текст
    $fiber = new Fiber(function (): void {    $value = Fiber::suspend('suspend');    echo "Value used to resume fiber: ", $value, "\n";});$value = $fiber->start();echo "Value from fiber suspending: ", $value, "\n";$fiber->resume('resume');> Вывод этого кода:Value from fiber suspending: suspendValue used to resume fiber: resume
    

    Значит ли это, что в PHP 8.1 будет асинхронность из коробки?
    Нет. Для асинхронных штук все еще надо будет использовать ReactPHP, Amp или подобные решения. Но использовать асинхронный код, и особенно интегрировать асинхронные блоки в традиционный код, будет намного легче.

    Подробнее про файберы можно почитать по ссылкам:
    Fibers PHP 8.1 Краткий пересказ RFC о PHP.Watch.
    Файберы PHP: Новый шанс для асинхронного PHP? Хороший разбор от мейнтейнера ReactPHP про суть файберов и типичные заблуждения.

    В PHP 8.1 файберы будут доступны из коробки в виде забандленного расширения ext-fiber. Но также автор говорит, что расширение будет обратно совместимым с PHP 7.2.

  • Мифы об асинхронном PHP Сергей Жук рассказывает основы: чем отличается конкурентность от параллельности, потоки и процессы, что такое неблокирующий ввод/вывод. И развенчивает популярный миф от том, что асинхронный PHP не является по-настоящему асинхронным.
  • Asynchronous PHP Multiprocessing, Multithreading & Coroutines Еще один пост об основах асинхронности в PHP от участника core team Laravel.

PHP Internals


  • [RFC] Auto-capturing multi-statement closures
    Сразу два предложения от Larry Garfield и Nuno Moduro по улучшению лямбд.

    В первом предлагается сделать короткие лямбды многострочными и с автозахватом переменных из скоупа.

    То есть сейчас можно вот так:
    $y = 1;$fn1 = fn($x) => $x + $y;
    

    или вот так:
    $fn2 = function ($x) use ($y): int {   // ...   return $x + $y;};
    

    А предлагается вот так:
    $c = 1;$foo = fn($a, $b):int {  // ...  $val = $a * $b;  return $val * $c;};
    

  • [RFC] Short Functions
    В этом RFC предлагается разрешить использовать стрелочный синтаксис в методах и обычных именованных функциях.

    // Былоfunction add(int $a, int $b): int{    return $a + $b;}// Сталоfunction add(int $a, int $b): int => $a + $b;
    

    Пример с короткими геттерами:
    Скрытый текст
    class Person{    public function __construct(        private string $firstName,        private string $lastName,    ) {}    public function getFirstName(): string => $this->firstName;    public function getLastName(): string => $this->lastName;    public function getFullName(): string => $this->firstName . ' ' . $this->lastName;}
    

    Если предложения будут приняты, то синтаксис функций в PHP будет полностью консистентен и описывается вот такими
    правилами
    Символ => указывает выполнить выражение справа во всех случаях (функции, лямбды, массивы, match).
    Скобки { ... } обозначает блок кода, в котором может быть return.
    Ключевое слово function означет что автозахвата переменных нет.
    Ключевое слово fn обозначает, что выполнится автозахват переменных по значению.
    Функция с именем объявляется глобально на этапе компиляции, Функция без имени объявляется локально как замыкание в рантайме.

  • [RFC] Deprecations for PHP 8.1
    Уже по традиции в каждом релизе часть неконсистентных функций и поведений объявляется устаревшими. В версии PHP 8.1 они будут бросать dreprecation notice, а уже PHP 9 будут удалены полностью.

    Пока ничего сверхпримечательного: mysqli::init(), функции key(), current(), next(), prev(), and reset() на объектах, и много еще подобного.
  • [RFC] Pure intersection types
    В PHP 8.0 были добавлены объединенные типы, а в данном RFC предлагается добавить пересечения типов.

    Синтаксис вот такой TypeA&TypeB и означает, что переменная должна одновременно быть instanceof TypeA и instanceof TypeB.

    class A {    private Traversable&Countable $countableIterator;    public function setIterator(Traversable&Countable $countableIterator): void {        $this->countableIterator = $countableIterator;    }    public function getIterator(): Traversable&Countable {        return $this->countableIterator;    }}
    

    Предложение называется pure intersection types, потому что комбинации с union типами не поддерживаются и оставлены на рассмотрение в будущем.
  • [Draft] Add FPM early bootstrapping mode
    В этом черновик Benjamin Eberlei (автор атрибутов в PHP 8) предлагает добавить опцию fpm.bootstrap_file в которой будет путь к скрипту. Этот скрипт будет выполнен перед тем, как FPM процесс начнет слушать входящие соединения. При этом память и состояния из этого скрипта шарится со сркиптом, который отрабатывает на FPM-соединение, то есть запрос.

    Другими словами, можно вынести бутстрап часть приложения в отдельный скрипт, который все еще выполняется на каждый запрос, но не в момент, когда устанавливается соединение, а чуть раньше, когда процесс только начинает слушать.


    То есть это что-то типа улучшенного auto_prepend_file.
  • PHP JIT/arm64 port Ребятки из ARM подключились и делают поддержку PHP JIT на ARM-процессорах.
  • [RFC] mysqli bind in execute Принят.

Инструменты


  • PeachPie 1.0.0 Вот уже 5 лет в рамках проекта PeachPie развивается компилятор PHP под .NET. Предствален стабильный релиз и теперь PeachPie позволяет рассматривать PHP как нативный язык .NET платформы. Применение: миграция приложений, кроссплатформенная разработка, другие экзотические кейсы.
  • sj-i/php-fuse FFI биндинги для libfuse можно сделать свою виртуальную файловую систему из чего угодно. В примерах есть ФС из PHP массива.
  • parsica-php/parsica Построитель парсеров с необычным синтаксисом: $parser = between(char('{'), char('}'), atLeastOne(alphaChar()));
  • spatie/period Библиотека позволяет делать сложные сравнения дат, например, найти пересечения периодов, разницу, пробелы, крайние границы и прочее.
  • pemistahl/grex Инструмент написан на Rust, но штука мегаполезная. Генерирует регулярные выражения по входным данным. То есть вводите одну или несколько строк, которые должны проходить регулярку, а на выходе получаете паттерн, котороый нужно слегка подправить.
  • i18n Ally JetBrains plugin Плагин PhpStorm для извлечения захардкоженных строк из Twig и PHP в YAML, JSON и XLIFF файлы. videoВидеодемо. Один из контрибьюторов плагина Edmund Beinarovic придет на стрим рассказать про плагин подробнее.

Symfony



Laravel



Yii


  • yiisoft/html Еще один пакет из семейства Yii 3. На этот раз для генерирования тегов HTML.

Статьи



Аудио/Видео



Сообщество






Стрим по мотивам PHP Дайджеста вместе со мной сегодня проведет Петр Мязин, автор подкаста Пятиминутка PHP.

Разберем новости и ссылки из выпуска с подробностями и деталями, и пообщаемся с гостем про плагин для PhpStorm i18n Ally.

Начало в 19:00 Москва, Минск, Киев.





Если вы заметили ошибку или неточность сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 200
Подробнее..

PHP Дайджест 204 (17 31 мая 2021)

31.05.2021 14:10:41 | Автор: admin
Фото: Christian Mnch.

В эти две недели core команда PHP активно обсуждала предложение по Partial function Application и в качестве альтернативы Никита Попов предложил более простой синтаксис для получения ссылки на любые функции. Также в уже принятые в PHP 8.1 енумы предлагается добавить статические свойства.

Symfony 6 будет требовать PHP 8.0, а вышедшая Doctrine 2.9 поддерживает указание метаданных в атрибутах вместо PHPDoc.

Еще в выпуске классная статья про регекспы и инструкция по использованию Deployer, а также другие полезные статьи, пачка инструментов, немного видео и подкастов.

Приятного чтения!


PHP Internals


  • [RFC] First-class callable syntax


    В качестве альтернативы довольно сложному [RFC] Partial Function Application Никита предлагает более простое решение проблемы получения ссылки на любую функцию или метод.

    // Сейчас вот так$fn = Closure::fromCallable('strlen');$fn = Closure::fromCallable([$this, 'method']);$fn = Closure::fromCallable([Foo::class, 'method']);// Предлагается вот такое$fn = strlen(...);$fn = $this->method(...);$fn = Foo::method(...);
    


    И соответственно, такой синтаксис можно будет применять везде, где ожидается Callable. Например, вот так:
    array_map(Something::toString(?), [1, 2, 3]);array_map(strval(...), [1, 2, 3]);// вместоarray_map([Something::class, 'toString'], [1, 2, 3])array_map('strval', [1, 2, 3]);
    

  • [RFC] Disable autovivification on false


    Сейчас PHP позволяет инициализировать массив из переменной со значением null или false. Предлагается для false все-таки бросать Fatal error:
    $a = true;$a[] = 'value'; // Fatal error: Uncaught Error: Cannot use a scalar value as an array$a = null;$a[] = 'value'; // Ok$a = false;$a[] = 'value'; // Сейчас это работает, но предлагается задепрекейтить
    
    3v4l.org/UucOC

  • [RFC] Allow static properties in enums


    В PHP 8.1 будут енумы. Подробный разбор был videoна стриме PHP-дайджеста и в тексте на php.watch.

    В енумах могут быть статические методы и константы, а предлагается добавить еще статические свойства.

    Пример использования
    enum Environment {    case DEV;    case STAGE;    case PROD;    private static Environment $currentEnvironment;    /**     * Read the current environment from a file on disk, once.     * This will affect various parts of the application.     */    public static function current(): Environment {        if (!isset(self::$currentEnvironment)) {            $info = json_decode(file_get_contents(__DIR__ . '/../../config.json'), true);            self::$currentEnvironment = match($info['env']) {                'dev' => self::DEV,                'stage' => self::STAGE,                'prod' => self::PROD,            };        }        return self::$currentEnvironment;    }    // Other methods can also access self::$currentEnvironment}printf("Current environment is %s\n", Environment::current()->name);
    

    Предложение спорное. Пишите в комментариях, что думаете по этому поводу.

    Кстати, в релизе PhpStorm 2021.2 уже будет поддержка enum, а пощупать можно будет на этой неделе в выпуске 2021.2 EAP.

  • [PR] Поддержка HTTP Early Hint support


    По умолчанию, PHP поддерживает отправку только одного набора заголовков. Но статус коды HTTP 1xx могут потребовать отправки нескольких наборов хедеров. В частности, для использования 103, нужно сначала отправить заголовки Link, и затем, когда весь ответ будет готов, отправить обычные 200 OK.

    Сейчас такое можно сделать, но немного криво: заголовки 103 отправить, как обычно, через header(), а следующую порцию заголовков вручную прям через echo.

    Никита предлагает добавить функцию для того, чтоб можно было отправлять несколько наборов заголовков. В пул-реквесте обсуждение API с участием команды Symfony и одним из авторов спецификаций HTTP.

  • check[RFC] Add IntlDatePatternGenerator


    Предложение принято. В PHP 8.1 будет класс IntlDatePatternGenerator для быстрого создания дат в локализированном формате. Подробнее в PHP Internals News #85 с автором RFC.

  • [RFC] Final class constants


    На голосовании.

  • В Internals обсуждается идея задепрекейтить багтрекер bugs.php.net


    Вместо него предлагается использовать issues на GitHub. У идеи есть как плюсы, так и минусы. Но как первый шаг, все баги документации теперь будут Гитхабе. Так что если вы нашли ошибку в мануале PHP, то можно просто создать issue в репозитории php/doc-en или php/doc-ru. Вот пример.


Инструменты


  • Doctrine ORM 2.9 Большое обновление популярной ORM. Под капотом поддержка атрибутов PHP 8, типизированные свойства, и другое.
  • Flarum 1.0.0 Релиз популярного движка для форума на PHP.
  • moneyphp/money 4.0 Пакет для правильной работы с денежными значениями.
  • phpast.com Просмотр дерева абстрактного синтаксиса PHP. Полезно при отладке инструментов на базе nikic/PHP-Parser. Код на гитхабе: ryangjchandler/phpast.com.
  • JBZoo/CI-Report-Converter Всеядный конвертер отчетов для CI. Основное призвание утилиты совместить самый разный результат линтеров с самыми разными CI (TeamCity, GitHub Actions, etc). Прислал smetdenis.
  • veewee/xml Все для удобной работы с XML в одном пакете.


Symfony




Laravel




Статьи




Аудио/Видео




community Сообщество





Подписывайтесь на Telegram-канал PHP Digest.

Если вам понравился дайджест, поставьте, пожалуйста, ему плюс это очень мотивирует продолжать делать.

Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.

Прислать ссылку можно через форму или просто написав мне в телеграм.
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 203

Подробнее..

PHP Дайджест 205 (1 15 июня 2021)

15.06.2021 00:15:33 | Автор: admin


Подборка свежих новостей и материалов из мира PHP. В выпуске: первая альфа PHP 8.1.0, Composer 2.1, Symfony 5.3 и другие релизы. Обзор новых предложений для PHP 8.1: Partial Function Application, pipe оператор, readonly свойства. А также порция полезных инструментов, статьи, видео и подкасты.

Приятного чтения!

Новости


  • PHP 8.1.0 alpha 1


    Вышел первая альфа и тем самым стартовал рели-процесс PHP 8.1. Обновления будут выходить каждые две недели по расписанию. Финальный релиз запланирован на 25 ноября.

    Заморозка фич ожидается 20 июля, а значит еще могут быть изменения. Из наиболее заметных новых фич на данный момент есть:

    • Enum они же перечисления RFC;
    • Новый тип never для возвращаемых значений RFC;
    • Файберы RFC;
    • Финальные константы в классах RFC;
    • Оператор распаковки поддерживает массивы со строковыми ключами RFC;
    • Объявлено устаревшим преобразование float в int, где теряется дробная часть RFC;
    • Интерфейс Serializable объявлен устаревшим RFC;
    • Запись восьмеричных чисел с префиксом 0o RFC;
    • Ограничено использование $GLOBALS RFC;

    Полный список изменений можно посмотреть на php.watch/versions/8.1.

  • PHP 8.0.7, PHP 7.4.20


    Багфикс релизы актуальных веток.

  • Стартовала программа раннего доступа PhpStorm 2021.2


    Каждую неделю публикуем новые билды, которые можно использовать бесплатно. А также анонсируем то, над чем идет работа в релизе.
    Уже доступны: поддержка енамов PHP 8.1, переработанный и улучшенный рефакторинг Extract Method, исправлены ошибки форматирования.

  • Composer 2.1.0


    Добавлена команда reinstall, которая удаляет и устанавливает перечисленные зависимости заново. Также пачка других улучшений и фиксов.

  • У каждого пакета на packagist.org теперь есть статистика по PHP-версиям


    Один из авторов Composer, Jordi Boggiano, каждые полгода публиковал в блоге пост со статистикой используемых версий PHP.

    Теперь вместо блога, эта общая статистика всегда доступна на packagist.org/php-statistics.

    Кроме того, у каждого пакета есть своя подобная страница, например, symfony/console/php-stats.

  • PHP Russia 2021


    Конференция состоится уже 28 июня. Программа сформирована habrничего лишнего, только хардкор, только технологии.

    Для читателей дайджеста есть промокод со скидкой: php_digest.


PHP Internals


  • [RFC] Partial Function Application


    Предложение было существенно переработано и объединено с более узким RFC от Никиты First-class callable syntax.

    Задача получать ссылку на любую функцию или метод. При этом с помощью ... можно заменить любое число аргументов, а с помощью плейсхолдера ? ровно один.

    Итого предлагается три способа получить ссылку на функцию:
    1. $func = some_func(...) так можно получить ссылку на любую функцию. Собственно, предложение Никиты.
    2. $func = some_func(1, 2, ?, 5) так можно получить ссылку с одним аргументом, что может быть полезно для различных колбэков.
    3. $func = any_func($all, $params, ...) так можно передать все аргументы в функцию, но при этом не вызывать ее. Ссылку позже можно вызвать, не передавая никаких параметров.

  • [RFC] Pipe Operator v2


    Если предложение выше пройдет голосование, то пайп-оператор станет его логичным продолжением.

    Вместо вложенных вызовов типа:

    array_filter(array_map('strtoupper', str_split(htmlentities("Hello World"))), fn($v) => $v != 'O');
    

    можно будет писать более понятные цепочки вида:

    $result = "Hello World"    |> htmlentities(?)    |> str_split(?)    |> array_map(strtoupper(?), ?)    |> array_filter(?, fn($v) => $v != 'O');
    

  • [RFC] Pure intersection types


    Предложение добавить пересечения типов находится на голосовании и похоже, что преодолеет необходимый порог. Тем временем можно послушать подкаст audioPHP Internals News #88 с George Peter Banyard, автором RFC.

  • [RFC] Readonly properties 2.0


    В качестве альтернативы довольно сложному и громоздкому предложению по акссессорам свойств сам же Никита выдвинул на рассмотрение RFC по readonly свойствам.

    Предлагается добавить модификатор readonly для свойств. Такие свойства нельзя будет изменить после инициализации.

    Скрытый текст
    class Test {    public readonly string $prop;    public function __construct(string $prop) {        // Legal initialization.        $this->prop = $prop;    }}$test = new Test("foobar");// Legal read.var_dump($test->prop); // string(6) "foobar"// Illegal reassignment. It does not matter that the assigned value is the same.$test->prop = "foobar";// Error: Cannot modify readonly property Test::$prop
    


    А в комбинации с constructor property promotion из PHP 8.0, можно будет сократить вообще до вот такого:

    class User {    public function __construct(        public readonly string $name    ) {}}$user = new User('Roman');echo $user->name; // Ok$user->name = 'Nikita'; // Error
    

  • [RFC] Make reflection setAccessible() no-op


    Сейчас чтобы получить доступ к свойству или методу через рефлексию, надо обязательно предварительно вызвать ->setAccessible(true).

    Marco Ocramius Pivetta предлагает убрать этот вызов, то есть ReflectionProperty и ReflectionMethod будут вести себя так, как если бы уже был вызван setAccessible(true).

    class Foo { private $bar = 'a'; }(new ReflectionProperty(Foo::class, 'bar'))->getValue();
    



Инструменты


  • nunomaduro/php-interminal Инструмент для чтения PHP Internals обсуждений в терминале. Пока умеет выводить только последние сообщения, но выглядит красиво.
  • joonlabs/php-graphql PHP-реализация спецификаций GraphQL. Автор утверждает, что быстрее чем другие реализации.
  • spiral/attributes Позволяет читать атрибуты из PHP 8 на PHP 7.2+ и дополнительно может работать с аннотациями доктрины. Фреймворк-агностик и для работы требует лишь nikic/php-parser. Прислал SerafimArts.
  • spiral/storage Компонент для работы с распределёнными файловыми хранилищами. Работает поверх thephpleague/flysystem и предоставляет более удобный API. Прислал SerafimArts.
  • kalessil/production-dependencies-guar Предотвращает добавление дев-пакетов в секцию require в composer.json.

    В тему у Валентина Удальцова на канале Пых была заметка с идеями проверок на CI.


Symfony




Laravel




Yii




Статьи




Аудио/Видео





Подписывайтесь на Telegram-канал PHP Digest.

Если вам понравился дайджест, поставьте, пожалуйста, ему плюс это очень мотивирует продолжать делать.

Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.

Прислать ссылку можно через форму или просто написав мне в телеграм.
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 204

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru