- PVSM.RU - https://www.pvsm.ru -

PHP-Дайджест № 174 (10 января – 24 февраля 2020)

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 1

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

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

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 2 Новости и релизы

  • PHP 7.4.3 [1] — На этот раз всё-таки исправили ошибки с использованием opcache.preload_user и теперь предзагрузку можно включать в продакшене.
  • PHP 7.3.15 [2]
  • PHP 7.2.28 [3]
  • Ближайшие мероприятия:
    • Санкт-Петербург, 28 февраля: SymCode-митап, TBA
    • Ростов-на-Дону, 29 февраля: 3-й PHP-митап городского чата [4]
    • Ярославль, 12 марта: BeerPHP [5]
    • Нижний Новгород, 14 марта: 3-й PHP-митап городского чата [6]
    • Екатеринбург, 26 марта: 3-й PHP-митап [7]
    • Казань, 28 марта: 2-й PHP-митап [8]
    skyeng/php-communities [9] — Открытый список PHP-событий, спикеров и организаторов.

    PHP fwdays'20, Киев, 30 мая [10] — В этом году среди докладчиков тот самый Никита Попов! Для читателей дайджеста есть промокод со скидкой 15%: PHPDIGEST2020.

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 3 PHP Internals

  • Language evolution [11] — Предложение Никиты о том, как продолжать двигать PHP вперед, не ломая легаси код. Подробнее в канале дайджеста [12], и обсуждение в пул-реквесте [13].
  • Приняты: [RFC] Variable Syntax Tweaks [14], [RFC] Static return type [15], [RFC] Allow ::class on objects [16]
  • [RFC] Write-Once Properties [17] — Предлагается добавить новый модификатор для свойств, который позволит инициализировать свойства, но запретить их изменение. Открытым остаётся вопрос названия модификатора, из вариантов: final, immutable, readonly, writeonce, locked, sealed.
    Скрытый текст

    class Foo
    {
        <keyword> public int $a = 1;
        <keyword> public string $b;
        <keyword> public array $c = ["foo"];
        <keyword> public object $d;
    
        public function __construct()
        {
            $this->b = "foo";
        }
    }
    
    $foo = new Foo();
    
    $foo->a = 42;		// EXCEPTION: property a has already been initialized
    $foo->b = "bar";	// EXCEPTION: property b has already been initialized
    $foo->a++;		    // EXCEPTION: incrementing/decrementing is forbidden
    unset($foo->c);		// EXCEPTION: unsetting is forbidden
    $foo->c[] = "bar";	// EXCEPTION: arrays can't be modified
    $var= &$this->c;	// EXCEPTION: reference isn't allowed
    
    $foo->d = new Foo();	// SUCCESS: property d hasn't been initialized before
    $foo->d->foo = "foo";	// SUCCESS: objects are still mutable internally
    

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

  • [RFC] str_contains [18] — Предлагается добавить функцию str_contains(string $haystack , string $needle) :bool, которая проверяет, содержится ли строка в другой строке вместо использования strpos() или strstr().
  • [RFC] Object-based token_get_all() alternative [19] — Предлагается добавить альтернативу для текущей функции token_get_all() [20], которая вместо микса строк и массивов возвращал бы массив объектов PhpToken.
  • [RFC] get_debug_type [21] — Ещё одна вспомогательная функция: комбинация gettype() и get_class().
  • [RFC] Allow explicit call-site pass-by-reference annotation [22] — Обновлённый RFC от Никиты снова на обсуждении. Предлагается сделать возможным явное указание передачи аргументов по ссылке. Тем самым предупреждая разработчика о том, что переданная переменная изменится. В этот раз также предлагается добавить директиву, чтоб сделать режим опциональным.
    Скрытый текст

    declare(require_explicit_send_by_ref=1);
    
    function byRef(&$ref) {...}
    byRef(&$var);
    
  • [Pre-RFC] Add support for «decorator» pattern [23] — Никита выложил прототип реализации паттерна «декоратор» для PHP.
    Скрытый текст

    interface Foo {
        public function method1(int $a): void;
        public function method2(): int;
        public function method3(string $b): string;
        public function method4(): stdClass;
        // ...
    }
    
    class ComposedFoo implements Foo {
        private decorated Foo $inner;
        public function __construct(Foo $inner) { $this->inner = $inner; }
        public function method4(): stdClass {
            return $DO_SOMETHING_DIFFERENT_HERE;
        }
    }
    
    /*
    Свойство помечено как decorated, что означает, что автоматически будут добавлены
    методы переадресации для всех публичных методов Foo, если только они не будут явно
    переопределены в классе. Эти методы будут иметь полные сигнатуры, поэтому они
    всё равно удовлетворяют интерфейсу.
    */
    
  • [PR] Use serialize_precision for printing floats in var_dump() [24] — Данное изменение повлияет на то, как будут отображаться float числа при выводе через var_dump() (0.1 + 0.2 === 0.30000000000000004 [25]):
    Скрытый текст

    
    // Было
    $sum = 0.1 + 0.2;
    var_dump($sum); // float(0.3)
    var_dump($sum == 0.3); // bool(false) WTF???
    
    // Станет
    $sum = 0.1 + 0.2;
    var_dump($sum); // float(0.30000000000000004)
    var_dump($sum == 0.3); // bool(false) Makes sense...
    

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 4 Инструменты

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 5 Symfony

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 8 Laravel

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 10 Yii

Async PHP

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 13 Материалы для обучения

PHP-Дайджест № 174 (10 января – 24 февраля 2020) - 18 Аудио/Видео

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

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

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

Прислать ссылку [81] — Попробуем через GitHub.
Поиск ссылок по всем дайджестам [82]
Предыдущий выпуск: PHP-Дайджест № 173 [83]

Автор: Роман Пронский

Источник [84]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/347541

Ссылки в тексте:

[1] PHP 7.4.3: https://www.php.net/ChangeLog-7.php#7.4.3

[2] PHP 7.3.15: https://www.php.net/ChangeLog-7.php#7.3.15

[3] PHP 7.2.28: https://www.php.net/ChangeLog-7.php#7.2.28

[4] 3-й PHP-митап городского чата: https://t.me/rndphp/2575

[5] BeerPHP: https://t.me/beerphp_yaroslavl

[6] 3-й PHP-митап городского чата: https://t.me/php_nn/3465

[7] 3-й PHP-митап: https://scienceman.timepad.ru/event/1263936/

[8] 2-й PHP-митап: https://php-not-dead.timepad.ru/event/1253335/

[9] skyeng/php-communities: https://github.com/skyeng/php-communities

[10] PHP fwdays'20, Киев, 30 мая: https://fwdays.com/en/event/php-fwdays-2020

[11] Language evolution: https://github.com/nikic/php-rfcs/blob/language-evolution/rfcs/0000-language-evolution.md

[12] канале дайджеста: https://t.me/phpdigest/120

[13] пул-реквесте: https://github.com/php/php-rfcs/pull/2

[14] [RFC] Variable Syntax Tweaks: https://wiki.php.net/rfc/variable_syntax_tweaks

[15] [RFC] Static return type: https://wiki.php.net/rfc/static_return_type

[16] [RFC] Allow ::class on objects: https://wiki.php.net/rfc/class_name_literal_on_object

[17] [RFC] Write-Once Properties: https://wiki.php.net/rfc/write_once_properties

[18] [RFC] str_contains: https://wiki.php.net/rfc/str_contains

[19] [RFC] Object-based token_get_all() alternative: https://wiki.php.net/rfc/token_as_object

[20] token_get_all(): https://www.php.net/manual/ru/function.token-get-all.php

[21] [RFC] get_debug_type: https://wiki.php.net/rfc/get_debug_type

[22] [RFC] Allow explicit call-site pass-by-reference annotation: https://wiki.php.net/rfc/explicit_send_by_ref

[23] [Pre-RFC] Add support for «decorator» pattern: https://github.com/php/php-src/pull/5168

[24] [PR] Use serialize_precision for printing floats in var_dump(): https://github.com/php/php-src/pull/5172

[25] 0.1 + 0.2 === 0.30000000000000004: http://0.30000000000000004.com/

[26] T-Regx/T-Regx: https://github.com/T-Regx/T-Regx

[27] lex111: https://habr.com/ru/users/lex111/

[28] vstelmakh/url-highlight: https://github.com/vstelmakh/url-highlight

[29] расширение для twig: https://github.com/vstelmakh/url-highlight-twig-extension

[30] symfony bundle: https://github.com/vstelmakh/url-highlight-symfony-bundle

[31] spiral/RoadRunner: https://github.com/spiral/roadrunner

[32] перезагружаются автоматически: https://roadrunner.dev/docs/beep-beep-reload

[33] tightenco/overload: https://github.com/tightenco/overload

[34] rainbow-alex/phi: https://github.com/rainbow-alex/phi

[35] nikic/PHP-Parser: https://github.com/nikic/PHP-Parser

[36] пачку проблем: https://github.com/nikic/PHP-Parser/issues/344

[37] Калькулятор настроек php-fpm: https://cmorrell.com/php-fpm/

[38] ergebnis/environment-variables: https://github.com/ergebnis/environment-variables

[39] Symfony 5. Быстрый старт: https://leanpub.com/symfony5-bystryj-start

[40] Неделя Symfony #686 (17-23 февраля 2020): https://symfony.com/blog/a-week-of-symfony-686-17-23-february-2020

[41] Как организовать скины в Symfony: https://habr.com/ru/post/488030/

[42] vladyslavstartsev/laravel-strict-coding-standard: https://github.com/vladyslavstartsev/laravel-strict-coding-standard

[43] thomasjohnkane/slow-query-notifier: https://github.com/thomasjohnkane/slow-query-notifier

[44] пост: https://thomaskane.io/laravel-slow-query-notifier

[45] beyondcode/laravel-server-timing: https://github.com/beyondcode/laravel-server-timing

[46] Server-Timing: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Server-Timing

[47] nunomaduro/laravel-mojito: https://github.com/nunomaduro/laravel-mojito

[48] Основы кэширования в Laravel: https://adelf.tech/2019/laravel-caching-basics

[49] Создаём простое аналитическое приложение: https://laravel.demiart.ru/jobs-and-queues-part-1-analytic-app/

[50] Подключения и настройки: https://laravel.demiart.ru/jobs-and-queues-part-2-connections-and-settings/

[51] Как запустить воркеры на продакшен-сервере: https://laravel.demiart.ru/jobs-and-queues-part-3-workers-in-production/

[52] Новости Yii 2020, выпуск 2: https://opencollective.com/yiisoft/updates/yii-news-2020-issue-2

[53] DriftPHP: https://github.com/driftphp

[54] о DBAL и ORM в ReactPHP: https://www.youtube.com/watch?v=bekZ7cPmSuE

[55] driftphp/tiny-load-balancer: https://github.com/driftphp/tiny-load-balancer

[56] Асинхронный PHP: https://habr.com/ru/company/oleg-bunin/blog/487258/

[57] PHPUnit: Угроза безопасности?: https://thephp.cc/news/2020/02/phpunit-a-security-risk

[58] В какой момент PHP вызывает __destruct()?: https://dev.to/themsaid/when-does-php-call-destruct-1167

[59] О битовых масках для хранения флагов в PHP: https://stitcher.io/blog/bitwise-booleans-in-php

[60] Чистый код на PHP: https://github.com/peter-gribanov/clean-code-php/blob/ru/README.md

[61] Clean Code: https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

[62] Использование RabbitMQ вместе с MonsterMQ часть 1: https://habr.com/ru/post/488850/

[63] Тест для PHP-разработчиков от Badoo: https://phpevent.badoo.com/habr

[64] разбор задач: https://habr.com/ru/company/badoo/blog/346652/

[65] Оффер в Лондон за один день: как его получить и чем заняться после переезда: https://habr.com/ru/company/badoo/blog/487914/

[66] Что делать с легаси. Материалы с Badoo PHP Meetup #4: https://habr.com/ru/company/badoo/blog/489362/

[67] Что будет в PhpStorm 2020.1: https://www.youtube.com/playlist?list=PLQ176FUIyIUb7qSArPCxOkIGX-cqdfoBx

[68] PHP для абсолютных новичков: https://www.youtube.com/watch?v=yXzWfZ4N4xU

[69] PHP Internals News podcast #40: https://phpinternals.news/40

[70] Никитой Поповым: https://twitter.com/nikita_ppv

[71] PHP Internals News podcast #41: https://phpinternals.news/41

[72] Steven Wade: https://twitter.com/stevenwadejr

[73] The Undercover ElePHPant #8: https://undercover-elephpant.com/episodes/talking-tuning-php-fpm-with-arne-blankerts

[74] Arne Blankerts: https://twitter.com/arneblankerts

[75] thephp.cc: https://thephp.cc/

[76] блогпост: https://tideways.com/profiler/blog/an-introduction-to-php-fpm-tuning

[77] личку: https://habrahabr.ru/conversations/pronskiy/

[78] почту: mailto:roman@pronskiy.com

[79] твиттер: https://twitter.com/pronskiy

[80] PHP Digest: https://t.me/phpdigest

[81] Прислать ссылку: https://github.com/phpdigest/addlink/issues/1

[82] Поиск ссылок по всем дайджестам: https://pronskiy.com/php-digest/

[83] Предыдущий выпуск: PHP-Дайджест № 173: https://habr.com/ru/post/487690/

[84] Источник: https://habr.com/ru/post/489662/?utm_source=habrahabr&utm_medium=rss&utm_campaign=489662