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

6skttzszxxwkscmtf8noagv_57q.jpeg

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

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


f574e9991c42407b8fa789a66b854f8d.png Новости и релизы


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

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


c9ee7880391644e4aef6cc28ca681ab0.png PHP Internals


  • Language evolution — Предложение Никиты о том, как продолжать двигать PHP вперед, не ломая легаси код. Подробнее в канале дайджеста, и обсуждение в пул-реквесте.
  • Приняты: [RFC] Variable Syntax Tweaks, [RFC] Static return type, [RFC] Allow: class on objects
  • [RFC] Write-Once Properties — Предлагается добавить новый модификатор для свойств, который позволит инициализировать свойства, но запретить их изменение. Открытым остаётся вопрос названия модификатора, из вариантов: final, immutable, readonly, writeonce, locked, sealed.
    Скрытый текст
    class Foo
    {
         public int $a = 1;
         public string $b;
         public array $c = ["foo"];
         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 — Предлагается добавить функцию str_contains(string $haystack , string $needle) :bool, которая проверяет, содержится ли строка в другой строке вместо использования strpos() или strstr().
  • [RFC] Object-based token_get_all () alternative — Предлагается добавить альтернативу для текущей функции token_get_all(), которая вместо микса строк и массивов возвращал бы массив объектов PhpToken.
  • [RFC] get_debug_type — Ещё одна вспомогательная функция: комбинация gettype() и get_class().
  • [RFC] Allow explicit call-site pass-by-reference annotation — Обновлённый RFC от Никиты снова на обсуждении. Предлагается сделать возможным явное указание передачи аргументов по ссылке. Тем самым предупреждая разработчика о том, что переданная переменная изменится. В этот раз также предлагается добавить директиву, чтоб сделать режим опциональным.
    Скрытый текст
    declare(require_explicit_send_by_ref=1);
    
    function byRef(&$ref) {...}
    byRef(&$var);
    
  • [Pre-RFC] Add support for «decorator» pattern — Никита выложил прототип реализации паттерна «декоратор» для 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 () — Данное изменение повлияет на то, как будут отображаться float числа при выводе через var_dump() (0.1 + 0.2 === 0.30000000000000004):
    Скрытый текст
    
    // Было
    $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...
    


cf862d9072784d04b621238ec137f2ca.png Инструменты


96b65e92179a40f2bd1884549973ddd5.png Symfony


314bd0f0dfc54e3fa7f0c0daef1a2d25.png Laravel


569de4298b764a33894aa517e74324f9.png Yii


Async PHP


329bec7c1e914963a1c5d2f2bfe99995.png Материалы для обучения


8dcc236774104f8286a40ceaea553820.png Аудио/Видео

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

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

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

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

© Habrahabr.ru