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


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

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



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



    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
      {
          <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 — Предлагается добавить функцию 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...
      

    Инструменты



    Symfony



    Laravel



    Yii



    Async PHP



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



    Аудио/Видео



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

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

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

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

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 39

      +3
      таке впечатление что над php никто кроме Никиты не работает, это конечно хорошо, что у него столько запала и энтузиазма, но что будет с языком если он надумает оставить проект(
        –1
        если он надумает оставить проект
        Одна надежда на Поцтеринга.
        –1
        >>> Предлагается добавить функцию str_contains
        ну наконец то!!! и за Clean Code тоже спасибо большое!
          +2

          Ну было бы куда чище вынести это все в статические методы класса String

            +1
            Ну было бы куда чище вынести это все в статические методы класса String

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

            Интереснее, возможно, было бы, если у конкретной строки можно было методы вызывать, вроде:
            a = "Hello, world!
            if(a.contains("world")) {
            // Some meaningful stuff
            }
              0

              Есть сторонние реализации типа такого


              $a = new String("Hello, world!");
              if($a->contains("world")) {
              // Some meaningful stuff
              }

              Можно, наверное, сделать это же как часть стандартной библиотеке, с нативными реализациями на Си. Но смысла особого лично я не вижу, если не реализовать фичу типа как JS: при вызове методов/свойств на скалярных типах, происходит неявное преобразование скаляра в соотвествующий объект, метод вызывается и значение преобразуется в исходный тип, если надо.


              Проще говоря на уровне языка осуществляется неявное преобразование $a->contains("world") в (new String($a))->contains("world"), а $b = $a->concat(" and other worlds ")->trim() в $b = (new String((new String($a))->concat(" and other worlds")->__toString())->trim()->__toString();


              Ну вот у меня очень сильные сомнения о необходимости ещё одного типа неявных преобразований в PHP.

                +1
                Ну… Мы снова, видимо, упираемся в то что преобразования/проверки лягут на рантайм.
                  +1

                  Без преобразований в реальном (после опкэша и jit) рантайме: отказаться от скалярных типов и сделать всё объектами, изменить реализацию операторов на вызов методов (под шумок перегрузку операторов можно сделать :) ) и т. п. Вот тут как раз jit может очень пригодиться.

          +1
          Спасибо за дайджейст! Сейчас читаю книгу «Чистый код» Роберта Мартина и адаптированные листинги для PHP очень кстати.
            0

            Спасибо за дайджест! С каждым таким анонсом жадно ищу упоминание дженериков и в большинстве случаев расстраиваюсь.

              0

              Дженерики можно описать в аннотациях и валедировать psalm или PHPStan. Это конечно не тоже самое, что натив, но лучше чем ничего.

                0

                Ещё бы PhpStorm их читал...

            –9
            Слишком много Никиты Попова.
            Сразу отмечу, конечно профи своего дела и я его уважаю.
            Но, это как то сужает нашу выборку, вместо обзора. включаем узкий прожектор.
            Я бы в будущих подборках всё же вносил специальные ограничения на упоминания материалов/идей и тп от одного человека/компании, чтобы специально нас заставлять смотреть шире.
            А так, спасибо за труд.
              +3

              Вы не в ФАС работаете?


              А если серьёзно, не упоминать важные (принятые или с высокой вероятностью принимаемые RFC) и интересные материалы только потому, что от одного человека наоборот заставляет смотреть уже.

                –2
                эм… я не это имел ввиду.
                Я просто не хочу, чтобы автор не попадал в классическую ловушку. Когда как бы темы многие закрыты, но слишком много одного взгляда (пусть и хорошего).
                Поэтому профи специально выбирают самое важное у этих людей, а так по другим новостям пытатся разбавить и другими источниками новостей/полезностей.
                Ну а на звезд всегда можно сделать ссылку. где конкретно на него можно подписать и следить.
                И уж точно я ничего не имею против Никиты Попова, он признаный профи, делает много важных и интересных штук.
              +2
              С интересом прочитал виденье Никиты Попова по развитию php без слома обратной совместимости. Интересно, есть ли что-нибудь подобное от основных разработчиков ядра php по вопросам асинхронности? Вроде бы тема очень актуальная и дискуссионная, но вот взгляд на эту проблему основных разработчиков php сходу найти не получилось.
                +1
                Интересно, есть ли что-нибудь подобное от основных разработчиков ядра php по вопросам асинхронности? Вроде бы тема очень актуальная и дискуссионная, но вот взгляд на эту проблему основных разработчиков php сходу найти не получилось.

                А чего не хватает?
                Синт. сахара в виде async/await?

                Основная проблема то не в самом php, а в экосистеме.
                  0
                  Поправьте, если ошибаюьс. Но php ведь не позволяет из коробки использовать асинхронность? Этого и не хватает. Также хотелось бы услышать размышления об этой проблематике в общем от разработчиков ядра и план продвижения в этом направлении. Когда в php появятся стандартные инструменты и подходы работы с асинхронностью, тогда уже и можно будет говорить об экосистеме.
                    0

                    Смотря что под асинхронностью понимать


                    есть например такое https://wiki.php.net/rfc/fiber

                      +1

                      Ну, socket-select и компании уже лет 20. Так, что сказать, что совсем не поддерживает нельзя. Но єто вс' на уровне биндингов к низкоуровневым функциям libc и т. п.

                        0
                        ReactPHP/Amp в общем-то из коробки можно использовать благодаря упомянутому socket-select.
                          +1
                          Поправьте, если ошибаюьс. Но php ведь не позволяет из коробки использовать асинхронность? Этого и не хватает.

                          Асинхронность = возможность приостанавливать и возобновлять поток выполнения программы, для того чтобы не блокировать основной поток выполнения на IO-bound операциях.

                          В большинстве случаев, при взаимодействии с файлами/сетевыми запросами/пр.(см. блокирующие опепрации) PHP простаивает в ожидании ответа.

                          Выполнять эти дела в неблокирующем режиме уже можно используя event-loop из amphp/reactphp/swoole и их адаптеры для хранилищ/файлов и пр. вместо существующих блокирующих.

                          Для приостановки потока выполнения на время IO-операций сейчас используются корутины, которые реализуются через генераторы — nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html, и неблокирующая поток запись/чтение из сокетов, т.е.:

                          Сделали запрос в БД -> Делаем дела -> при удобном моменте читаем ответ от БД(в php используется кооперативная многозадачность, и если кто-то таки заблокирует поток выполнения будет нехорошо) -> продолжаем поток выполнения который ожидал ответа от базы ($generator->send($data))
                      +4
                        +2
                        Обновил ссылку.
                        0

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


                        Будем дальше в симфони страдать с phpdoc.

                          0

                          Я так понял что это работает как что-то среднее между наследованием и композицией. Со стороны наследования взяли поведение, но при этом не используют "extends", а со стороны композиции — то, что в конструктор объект исходного класса передают и присваивают его приватному свойству

                            0
                            Именно так. У нас в проекте очень интенсивно используется декораторы, и к сожалению, полезный код теряется среди бойлерплейта из методов для проксирования запроса декорируемому объекту.
                            0
                            Это про Этот декоратор. Хотя я поначалу тоже подумал про ts/python.
                            0
                            Ютюб канал на новые фичи для идею — отличная идея.
                              0
                              Можно где-нибудь найти хотя бы оглавление книги «Symfony 5. Быстрый старт»?
                              –1
                              Самое забавное что язык активно развивается и продолжает обрастать инструментарием, а хейтеры клана js его хоронят который год.
                                0
                                Самое забавное что язык активно развивается и продолжает обрастать инструментарием, а хейтеры клана js его хоронят который год.

                                То что язык развивается не отличает его от других популярных и не очень языков. Странный аргумент.
                                  0
                                  С учетом количества проблем в PHP он слишком медленно развивается. Вот не понятно зачем сейчас было JIT делать, лучше бы акцент на сам язык сделали.
                                    0
                                    Множество проблем не могут сдвинуть с мервой точки из-за обратной совместимости. И как раз ее и пытаются решить — читайте линку Language evolution. Очевидно, что это сейчас главная тема разговоров, после стабилизации php8.

                                    Лично мне не нравятся все варианты от Попова. Но ктож с ним обсудит другие варианты?
                                  0
                                  Основы кэширования в Laravel.


                                  Было и тут: habr.com/ru/post/463495
                                    0

                                    Митап SymCode вынужденно перенесен на 13 марта да и то пока еще не 100% что получится
                                    Увы, сложно с докладчиками пока что ...

                                      0
                                      Обновил пост.

                                    Only users with full accounts can post comments. Log in, please.