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

Php-дайджест

PHP-Дайджест 182 (1 22 июня 2020)

22.06.2020 10:10:48 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: 3 принятых и 6 новых RFC-предложений из PHP Internals, включая голосование за новый синтаксис для атрибутов @@ и почему #[] был бы лучше, переименования black/whitelist в PHP-мире, как отлаживают PHP-разработчики, аналог ngrok на PHP, видео, подкасты и многое другое.

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



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



Yii



Laminas



Async PHP



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



Аудио/Видео



Спасибо за внимание!

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

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

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

Подробнее..

PHP-Дайджест 185 (20 июля 3 августа 2020)

03.08.2020 12:13:23 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 Alpha 3, PhpStorm 2020.2, новый оператор ?->, снова обсуждение синтаксиса атрибутов и другие новости PHP Internals, обзор системы типов в PHP, порция полезных инструментов, видео, стримы и многое другое.

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



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


  • PHP 8.0.0 Alpha 3 Последний альфа-релиз из запланированных. Первая бета ожидается 6 августа.
  • Релиз PhpStorm 2020.2 Объединенные типы PHP 8, новый движок потока управления, пул-реквесты GitHub, OpenAPI. По ссылке подробный разбор этих и других изменений.

PHP Internals


  • [RFC] Shorter Attribute Syntax Change История с синтаксисом атрибутов в PHP 8 продолжается. Предыстория была в канале.

    Вкратце: сначала был << >>, переголосовали за @@, а теперь новый виток обсуждений.
    У @@ были проблемы с парсером, но они решены благодаря нижеупомянутому RFC про неймспейсы. Тем не менее у него есть другие проблемы, и в качестве альтернативы предлагался вариант #[ ] как в Rust, но и у него есть минусы.

    Дошло до того, что рассматривается вариант переголосования за новый синтаксис и перенос атрибутов в PHP 8.1, потому что фиче-фриз для 8.0 уже 4 августа. То есть либо в PHP 8.0, но с одним из << >>, #[], @@, либо в PHP 8.1 с чем угодно.

    Для последнего случая предлагаются самые разные новые варианты: @[Attribute], в комментарии PHPDoc с двойной собачкой /** @@MyAttribute */, или даже маловероятный переделать оператор подавления ошибок из @ в @@, а одинарную @ использовать в атрибутах.


Laravel



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



Аудио/Видео



Спасибо за внимание!

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

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

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

PHP-Дайджест 186 (3 17 августа 2020)

17.08.2020 12:08:41 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 Beta 1, снова о синтаксисе атрибутов в PHP 8: #[Attr] vs @[Attr], предложение по синтаксису для BigInt, обзоры PHP8 и много других видео, инструменты, стримы, подкасты.

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



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



PHP Internals


  • [RFC] Shorter Attribute Syntax Change История с синтаксисом атрибутов в PHP 8 продолжается. О финальном голосовании было в канале, но позже оно было приостановлено из-за того, что не был соблюден регламент по 2х-недельному обсуждению.

    Tycon Andre привел примеры, не очень удачного поведения варианта #[Attr] в PHP 7. C другой стороны, какая разница, если остальные варианты просто отвалятся с ошибкой парсинга?

    И сравнение синтаксисов @@Attr, #[Attr], <<Attr>> и @[Attr]:
    Скрытый текст
    @@ORM\Entity@@ORM\Table("user")class User{    @@ORM\Id @@ORM\Column("integer") @@ORM\GeneratedValue    private $id;    @@ORM\Column("string", ORM\Column::UNIQUE)    @@Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])    private $email;}#[  ORM\Entity,  ORM\Table("user")]class User{    #[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]    private $id;    #[ORM\Column("string", ORM\Column::UNIQUE)]    #[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]    private $email;}@[  ORM\Entity,  ORM\Table("user")]class User{    @[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]    private $id;    @[ORM\Column("string", ORM\Column::UNIQUE)]    @[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]    private $email;}<<  ORM\Entity,  ORM\Table("user")>>class User{    <<ORM\Id, ORM\Column("integer"), ORM\GeneratedValue>>    private $id;    <<ORM\Column("string", ORM\Column::UNIQUE)>>    <<Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])>>    private $email;}@:ORM\Entity@:ORM\Table("user")class User{    @:ORM\Id @:ORM\Column("integer") @:ORM\GeneratedValue    private $id;    @:ORM\Column("string", ORM\Column::UNIQUE)    @:Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])    private $email;}
    
  • [RFC] Named Parameters explicit opt in Документ был переделан и теперь вместо переименования параметров предлагает лишь явно указывать, что данный параметр именованный.
    // Именованный параметр включен явноfunction callBar(Foo $:parameterName) {    $internalName->bar();}$x = new Foo();callBar(parameterName: $x);// Параметр не именованныйfunction callBar($externalName) {    $externalName->bar();}$x = new Foo();callBar(externalName: $x); // Error: cannot call function callBar() using parameter $externalName by name.
    
    Поскольку PHP 8 уже заморожен для новых фич, то данное предложение возможно только в 8.1, да и то маловероятно.
  • [Proposal] Bigint shorthand (123n) for GMP objects Интересное предложение пока без официального RFC.

    Предлагается реализовать в PHP синтаксис для больших чисел аналогичный JavaScript с добавлением в конце суффикса n:
    $theBiggestInt = 9007199254740991n
    

    При этом под капотом будет использоваться GMP. А поскольку для объектов GMP уже перегружены арифметические операторы, а также битовые и сравнения, то работа с такими числами будет прозрачной.
  • В рамках дискуссии на тему улучшения интерактивного шелла PHP (php -a), предложен PR, который позволит задавать колбэк отрабатывающий на вывод из интерактивного шелла. Или пока можно использовать bobthecow/psysh.
  • cross[RFC] PHP Namespace Policy Отклонен.

Инструменты


  • PHPUnit 9.3 C поддержкой PHP 8 и Xdebug 3.
  • sebastianbergmann/cli-parser Микропакет для парсинга аргументов командной строки, выделенный из PHPUnit.
  • coduo/php-matcher Валидация данных по паттернам для тех, кто не хочет в регекспы.
  • phpfn/phpfn Функциональные примитивы от SerafimArts.
  • hidehalo/nanoid-php PHP-реализация Nanoid безопасного URL-совместимого генератора уникальных идентификаторов.
  • woohoolabs/zen Простой PSR-11-совместимый контейнер с генератором файла предзагрузки.
  • loophp/collection Легковесные коллекции.

Symfony



Laravel



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



Аудио/Видео



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





Спасибо за внимание!

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

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

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

PHP-Дайджест 187 (18 августа 7 сентября 2020)

07.09.2020 12:20:38 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 beta 3, принят новый синтаксис атрибутов в PHP 8, Zephir всё, целая пачка полезных инструментов, статьи, видео, подкасты.

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



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


  • PHP 8 beta 3 Последняя бета в цикле. Следующим релизом станет RC 1, который ожидается 17 сентября.
  • PHP 7.4.10, PHP 7.3.22
  • Будущее Zephir и Phalcon Один из контрибьюторов языка Zephir и PHP-фреймворка Phalcon ушёл из проекта, поэтому активная разработка Zephir приостановлена, а Phalcon 5 планируется переписать на чистый PHP.
  • В WordPress сообществе обсуждается план по поддержке версий PHP. Судя по ответам лидера проекта Matt Mullenweg, PHP 5.6 будет поддерживаться еще долго. По официальной статистике PHP 5.6 используется на 21.6% установок WP.

PHP Internals


  • check[RFC] Shorter Attribute Syntax Change Наконец-то закончилась эпопея с синтаксисом для атрибутов. На переголосовании принят вариант #[Attribute].
    #[  ORM\Entity,  ORM\Table("user")]class User{    #[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]    private $id;    #[ORM\Column("string", ORM\Column::UNIQUE)]    #[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]    private $email;}
    

    Кстати, предыдущий синтаксис с @@Attr не поддерживал группировку атрибутов и поэтому такая возможность была убрана из PR. Но поскольку у #[ ] есть маркер конца, то группировку он поддерживает и она была возвращена.

    // Можно и так#[ORM\Entity]#[ORM\Table("user")]// и так#[    ORM\Entity,    ORM\Table("user")]
    

    Подробнее об атрибутах было в посте.
  • new[RFC] any() and all() on iterables Предлагается добавить две новых функции в стандартную библиотеку:
    any(iterable $input, ?callable $callback = null): bool запустит колбек на каждом элементе и остановится, на первом, который вернет true.
    all(...) вернет true только, если колбек вернет true для каждого элемента.

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

    // Было$satisifes_predicate = false;foreach ($item_list as $item) {    if (API::satisfiesCondition($item)) {        $satisfies_predicate = true;        break;    }}if (!$satisfies_predicate) {    throw new APIException("No matches found");}// Сталоif (!any($item_list, fn($item) => API::satisfiesCondition($item))) {    throw new APIException("No matches found");}
    

Инструменты


  • Pest 0.3 Обертка над PHPUnit, которая позволяет писать тесты в более простом виде. Также готов плагин для PhpStorm Pest IntelliJ.
  • Codeception/Verify 2.0 Ассершены для PHPUnit и Codeception с fluent-интерфейсом.
  • ramsey/composer-repl Добавляет команду composer repl для запуска bobthecow/psysh.
  • brick/money Библиотека для работы с денежными данными. Работает, даже если не уставлены GMP или BCMath. Сравнение с moneyphp/money.
  • bassim/super-expressive-php Библиотека позволяет описывать регулярные выражения почти-естественным языком через текучий интерфейс. Альтернатива VerbalExpressions/PHPVerbalExpressions.
  • phpsci/phpsci-carray Расширение PHP для научных вычислений. Основано на NumPy.
  • github.com/phpwebclient Декораторы и хелперы для PSR-18 совместимых HTTP-клиентов.
  • hamlet-framework/type Библиотека для спецификации типов. Может быть использована везде, где нужна спецификация типов, включая cast, assert, instanceof и т. п.

Symfony



Laravel



Yii


  • yiisoft/auth Свежий пакет из семейства Yii 3 предоставляет различные методы аутентификации, набор абстракций для реализации в приложении, и PSR-15 middleware для аутентификации.
  • yiisoft/strings Хелперы для работы со строками.

Async PHP



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


Подробнее..

PHP-Дайджест 189 (21 сентября 5 октября 2020)

05.10.2020 12:23:18 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8.0 RC 1 и переименование параметров внутренних функций, PhpStorm 2020.3 EAP, многострочные короткие лямбды, атрибуты для групп свойств и другие новости PHP Internals, порция полезных инструментов, статьи, стримы, подкасты.

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



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


  • PHP 8.0.0 RC 1 Стартовал цикл релиз-кандидатов ветки 8. Запланировано 4 выпуска и второй релиз-кандидат ожидается 15 октября.

    Усилия core-команды сосредоточены на пересмотре имен аргументов во всех модулях. Пример переименований в PDO. За ходом можно наблюдать здесь.
  • PhpStorm 2020.3 EAP Стартовала программа раннего доступа. Уже реализована полная поддержка PHP 8 поможет быстро сделать пакеты совместимыми с новой версией интерпретатора. Запланированы Xdebug 3, PHPStan/Psalm (в следующих билдах), интеграция Guzzle с HTTP-клиентом и другие фичи.
  • PHP 7.2.34
  • PHP 7.3.23
  • PHP 7.4.11
  • ruphpcommunity.ru PHP-митапы, чаты и ютуб-каналы.
  • Традиционный Hacktoberfest с возможностью получить футболку за 4 пул-реквеста в открытые проекты пошел в этом году не по плану.

    Какой-то ютубер опубликовал инструкцию и показал, как делать примитивные пул-реквесты с изменениями в readme. Посыпался шквал бессмысленных PR. В итоге DigitalOcean теперь учитывают пул-реквесты только в те репозитории, у которых авторы явно указан топик hacktoberfest.

    Если вы хотите поучаствовать в опенсорсе и получить футболку, то вот инструкция как сделать хороший пул-реквест и список и issues с тегом #hacktoberfest в PHP-проектах.

PHP Internals


  • check[PR] Attributes on property groups Атрибуты можно будет указывать сразу для группы свойств, а не только по одному, так же как это работает для модификаторов доступа.
    class FooBar {    #[NonNegative]    public int $x, $y, $z;}
    
  • check[PR] Attributes and strict types Также атрибуты будут принимать во внимание директиву strict_types=1.
  • [PR] OPCache: Direct execution opcode file without php source code file Концепт в виде в PR, в котором автор предлагает сделать возможным сохранять бинарный файл опкеша и запускать его уже без исходника. По сути, это что-то напоминающее подход в Java или очень похожее на питоновские файлы .pyc / .pyo.

    Теоретически, в этом случае можно было бы распространять предварительно скомпилированный PHP-код без исходников. Типа как .phar, но уже интерпретированный.

    Но в обсуждении указали на проблемы такого подхода. Формат опкода в PHP нестабилен и несовместим от версии к версии. Причем даже в рамках патч-релизов, то есть код скомпилированный на PHP 7.4.22 может просто свалиться с segfault на PHP 7.4.23. А сделать его стабильным маловероятно.
  • [PR] Multiline arrow functions Короткие лямбды, добавленные в PHP 7.4, могут содержать только одно выражение. В этом пул-реквесте представлена реализация многострочных коротких лямбд:
    $guests = array_filter($users, fn ($user) => {  $guest = $repository->findByUserId($user->id);  return $guest !== null && in_array($guest->id, $guestsIds);});
    

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

    Также остается открытым вопрос синтаксиса, а именно стоит ли добавлять стрелку =>:
    fn() => {}
    
    или
    fn() {}
    

Инструменты


  • thephpleague/event 3.0.0 Популярный пакет для событий теперь совместим с PSR-14.
  • terrylinooo/simple-cache Драйверы кеша по стандарту PSR-16 для хранения в файлах, Redis, MySQL, SQLite, APC, APCu, Memcache, Memcached и WinCache.
  • Code With Me (EAP) В тестовом режиме доступен плагин для совместной работы в IDE от JetBrains.
  • Bolt 4.0 Обновление популярной CMS на Symfony- компонентах.

Symfony



Laravel



Yii


  • W3C откажется от WordPress и будут использовать CraftCMS, который сделан на базе Yii 2. Сама новость не была бы такой интересной без отличного документа о том, какие аспекты принимались во внимание при выборе.

Async PHP


  • micc83/mailamie Простой SMTP-сервер для тестирования отправки почты. Реализован на ReactPHP.

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



Аудио/Видео






Спасибо за внимание!

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

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

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

PHP-Дайджест 190 (5 19 октября 2020)

19.10.2020 12:14:37 | Автор: admin
Фото: Илья Шихалеев.

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8.0 RC 2, Xdebug 3 beta, PhpStorm EAP с поддержкой PHPStan и Psalm, порция полезных инструментов, статьи, видео, митапы.

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



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



Инструменты


  • PHP-DI Независимый от фреймворка DI-контейнер.
  • markrogoyski/math-php Мощная современная математическая библиотека для PHP.
  • Danack/FloatHex Функции для преобразования числа с плавающей точкой в шестнадцатеричную строку и обратно, а также для отображения двух чисел с плавающей точкой в виде двоичного представления. Или еще раз почему 0.1 + 0.2 === 0.3 -> false
    Скрытый текст
    echo float_compare(0.3, 0.1 + 0.2);>> Sign  Exponent     Mantissa                                                 0  01111111101  0011001100110011001100110011001100110011001100110011     0  01111111101  0011001100110011001100110011001100110011001100110100     -  -----------  -------------------------------------------------xxx 
    
  • marcocesarato/PHP-Antimalware-Scanner Сканер для поиска вредоносного кода в PHP-файлах.
  • Prometheus PHP Клиент для prometheus.io на PHP.
  • shivammathur/setup-php GitHub action для установки PHP, расширений, и прочего для последующего использования в своих пайплайнах. Небольшой обзор в блоге GitHub.

Symfony



Laravel



Async PHP


  • clue/reactphp-mq Легковесная очередь сообщений в памяти на базе ReactPHP.

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



Аудио/Видео





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

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

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

PHP-Дайджест 191 (19 октября 2 ноября 2020)

02.11.2020 14:14:45 | Автор: admin
Фото: Валерий Горбачев (PHP Krasnodar)

Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8.0 RC 3 и видеообзоры новых возможностей, Composer 2, завершение разработки Faker (теперь в новой организации), два новых RFC для PHP 8.1, порция полезных инструментов, статьи, видео с прошедших митапов.

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



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



PHP Internals


  • [RFC] Short Functions В этом RFC предлагается добавить синтаксис стрелочных функций для однострочных именованных функций и методов.
    class Person{    public function __construct(        private string $firstName,    ) {}    public function getFirstName(): string => $this->firstName;}"
    
  • [RFC] Explicit octal integer literal notation В PHP шестнадцатеричные числа записываются с префиксом 0x, а двоичные с 0b. Восьмеричные же сейчас выбиваются из ряда и записываются с префиксом 0. Кроме неконсистентности, это может привести к проблемам при нестрогом сравнении с числовой строкой. Например, 016 в десятичном представлении равно 14 и в результате "016" == 016; // false.

    Предлагается для восьмеричных чисел разрешить нотацию с префиксом 0o, которая является стандартом и используется во многих других языках.
    0o16 === 14; // true016 === 0o16; // true"016" == 0o16; // false
    
  • Literal types PoC Концепт литерального типа для PHP как в TypeScript.
    function foo(): "foo"|"bar" {    return "foo";}
    

    Литеральный тип вряд ли будет реализован в PHP, но вот есть черновик RFC с предложением алгебраического типа данных, т. е. продвинутых перечислений.

Инструменты


  • Infection PHP 0.20 В свежем обновлении фреймворка для мутационного тестирования добавлено 8 новых мутаторов и возможность автоматически добавлять комментарии прямо в PR на GitHub.
  • JustSteveKing/php-sdk Скелет для разработки PHP SDK для сервисов и API.
  • Hi-Folks/rando-php Хелпер для генерирования псевдослучайных данных с различными фильтрами: $randomChars = Randomize::sequence()->chars()->count(10)->noDuplicates()->generate();
  • voku/PHPDoctor Проверяет файлы и директории и находит места, где не хватает деклараций типов.
  • Psalm 4 Обновление популярного статического анализатора.
  • phpDocumentor v3.0.0 Мажорное обновление инструмента для генерирования документации на основе PHPDoc.

Symfony



Laravel



Yii



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



Аудио/Видео





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

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

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

PHP-Дайджест 192 (2 16 ноября 2020)

16.11.2020 14:12:10 | Автор: admin

Свежая подборка со ссылками на новости и материалы. В выпуске: Последний релиз-кандидат PHP 8.0 перед финальным релизом и свежие материалы по PHP 8, RFC и обсуждения из PHP Internals, порция полезных инструментов, стримы, подкасты, статьи.

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



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



PHP Internals


  • [Draft] Closure self reference Ранний черновик на обсуждении. Предлагается в замыканиях добавить псевдопеременную $lambda, которая указывает на само замыкание. По аналогии с $this для классов.
    $fibonacci = function (int $n) use (&$fibonacci) {    if ($n === 0) return 0;    if ($n === 1) return 1;    return $fibonacci($n-1) + $fibonacci($n-2);};// =>$fibonacci = function (int $n) {    if ($n === 0) return 0;    if ($n === 1) return 1;    return $lambda($n-1) + $lambda($n-2);};
    
  • [PR] Support for <func>::function syntax Концепт синтаксиса ::function (или ::fn) для получения полного неймспейса и имени функции по аналогии с ::class. Подобное предложение обсуждалось раньше и имеет проблемы, но вполне вероятно будет принято.
  • [Discussion] Alias for `int|float` Обсуждалась возможность ввести псевдоним number или numeric для объединенного типа int | float. В комментариях указали, что уж лучше позже сделать полноценные алиасы для типов как в TypeScript: type Number = Foo|Bar;.

Инструменты


  • mnavarrocarter/php-fetch Порт fetch WebApi на PHP без сторонних зависимостей. Лаконичный HTTP-клиент в одной функции:
    Скрытый текст
    use function MNC\Http\fetch;$response = fetch('http://personeltest.ru/aways/habr.com');echo $response->status()->code();   // 200echo buffer($response->body());// orwhile (($chunk = $response->body()->read()) !== null) {    echo $chunk;}
    
  • themsaid/ibis Поможет сгенерировать полноценную электронную книгу в PDF из markdown-файлов.
  • i582/phpstats Инструмент для сбора метрик кода и графов зависимостей для PHP. Реализован на базе VKCOM/noverify, то есть на Go.
  • mihaeu/dephpend Инструмент статического анализа, который поможет выявить проблемы в архитектуре путем анализа зависимостей классов.
  • httpsoft/http-message Строгая и быстрая реализация стандартов #PSR-7 и #PSR-17.
  • spatie/crypto Небольшая обертка над openssl для шифрования данных с помощью приватного/публичного ключа. Вводный пост.
  • icanhazstring/systemctl-php PHP-обертка над systemctl.

Symfony



Laravel



Yii



Async PHP



phpstorm PhpStorm



Разное



Аудио/Видео



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


  • vincentpontier.com/elephpant/ Официальный магазин слоников снова доступен! Можно заказать розового и синего.

Спасибо за внимание!

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

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

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

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