Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 7.4, PhpStorm 2019.3, InfectionPHP и другие релизы, статистика версий PHP, об использовании FFI, видео с прошедших конференций и митапов, порция полезных инструментов, и многое другое.

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



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



Инструменты


  • Infection 0.15.0 — Обновление инструмента для мутационного тестирования в PHP. В новой версии: Поддержка Codeception, PHP 7.4, Symfony 4.4 и 5.0, пара новых мутаторов и другое.
  • clue/phar-composer — Инструмент для создания phar-архива из любого проекта на основе Composer. Пост в поддержку.
  • phplrt/phplrt — Инструмент для создания парсеров на PHP по заданной грамматике. Пример: парсер json5.
  • shivammathur/setup-php — GitHub action для добавления в свой воркфлоу, который подготовит среду PHP для дальнейших шагов.
  • vlucas/phpdotenv V4.0 — Автоматическая загрузка переменных окружения из файла .env.
  • totten/pogo — Инструмент позволяет писать однофайловые скрипты, указывая Composer-зависимости непосредственно в PHP-файле. Идея уже была реализована в sensiolabs/melody.
  • PHPStan 0.12 — Статический анализатор для PHP в новой версии с поддержкой дженериков через PHPDoc аннотации.

Symfony



Laravel



Yii



Zend


  • Новости о Laminas — Проект Apigility будет переименован в Laminas API Tools (неймспейс Laminas\ApiTools), а Expressive будет называться Mezzio. Официальный релиз Laminas запланирован на январь 2020.

Async PHP



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



Аудио/Видео



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



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

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

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

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

Комментарии (20)


  1. Jokerzp
    09.12.2019 14:47
    +1

    Спасибо за очередной дайджест, вы делаете большую работу для всего PHP комьюнити!
    В особенности, благодарю за ссылочки на плейлисты с Laravel EU 2019 и PHP.Barcelona 2019, пробежался глазами по названиям докладов — однозначно в закладки.


  1. xxxalz
    09.12.2019 21:32

    на Yii еще кто-то пишет новые проекты?


    1. trueMoRoZ
      09.12.2019 21:42
      +2

      а чем таки он плох? тем более готовится 3 версия. Знаю вот одну контору, которая собралась переезжать именно на Yii со своего велосипеда.


    1. affka
      10.12.2019 06:57
      +1

      Еще как пишут! Если речь о Yii2, конечно… Мы его используем с большим числом доработок, правда, с которыми он не чуть не хуже других фреймворков становится)


    1. istepan
      10.12.2019 08:36
      +1

      Мы пишем новые проекты исключительно на Yii.
      Выбор обусловлен тем что у нас все проекты написаны на этой платформе и в России Yii пользуется большей популярностью. Легче найти и обучить разработчика.
      Отличная документация на русском и активное адекватное комьюнити.

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


    1. joffer
      10.12.2019 16:09

      Yii2 вполне хорош, последний большой проект начали именно на нём. Много что удобно сделано, многие вещи позволяется сделать супербыстро, активно используем виджеты, коммьюнити живое и помогающее. Есть и другие фреймворки, тот же кодИгнайтер, та же Ларавель, но Йии вполне удобен и комфортен, чтобы не смотреть по сторонам, по крайней мере это справедливо внутри нашей компании)


  1. vp_arth
    09.12.2019 22:06
    +1

    > Как узнать равны ли два float в PHP
    Заинтересовала статья на предмет корректности.

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

    <?php
    $a = 1e99;
    $b = $a + 6.07e82;
    $c = $a + 6.08e82;
    var_dump($a == $b); // true
    var_dump($a == $c); // false
    var_dump(\abs($a - $b)); // 0
    var_dump(\abs($a - $c)); // float(1.2141680576411E+83)
    var_dump(PHP_FLOAT_EPSILON);
    // float(1.2141680576411E+83)<float(2.2204460492503E-16) ?
    var_dump(\abs($a - $c) < PHP_FLOAT_EPSILON); // false
    
    


    Как видим, ненулевая дельта далека от PHP_FLOAT_EPSILON. Смысл последнего сравнения(взятого из статьи) от меня ускользает. Помогите понять, что это и зачем.


    1. Hett
      09.12.2019 22:29
      +1

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


      1. vp_arth
        09.12.2019 22:39
        +1

        Ок, согласен.

        $a = 1e99;
        $b = 2e99;
        $c = 3e99;
        $ab = $a + $b;
        var_dump($ab == $c); // false
        var_dump(\abs($ab - $c) < PHP_FLOAT_EPSILON); // false
        


        Оно и понятно, казалось бы.

        На мой взгляд, необходимо привести порядок epsilon в соотвествие с порядком сравниваемых значений, например так:

          var_dump(\abs($ab - $c) < PHP_FLOAT_EPSILON * \min($ab, $c)); // true
        


  1. toratoda
    10.12.2019 09:04
    -7

    Признаюсь меня бесит PhpStorm: его необходимость писать комментарии и код так чтоб «иде понимала что я хочу написать и подсказывала мне». Я считаю что код должен быть понятен людям, а не редактору в котором я пишу.


    1. Adelf
      10.12.2019 17:52
      +2

      Один раз я работал в команде, где большинство писало в текстовых редакторах, а не в IDE. Постоянно были PR, в которых тесты валились из-за того что забыли сделать use классу. Или вызвали $this-> там, где это нельзя. И куча подобных вещей, которые юзеры шторма просто не поймут.


      1. toratoda
        11.12.2019 11:04

        Для проверки на такие ошибки существуют phpmd, phpcs, phplint (проверку можно привязать по сохранению файла).
        И я не про это, а например про написание комментариев с указанием типов атрибутов чтоб шторм понимал это для подсказки методов, в то время как указание типизации для них уже ввели в php.


        1. tendium
          11.12.2019 12:33

          PhpStorm вообще-то не нуждается в подсказках в тех случаях, когда типы указаны однозначно. Но как вы, например, укажете, что вы ожидаете массив объектов с конкретным классом/интерфейсом? В PhpDoc (который, кстати, придумали не в JetBrains) это можно указать как `Type[]`.


          1. toratoda
            12.12.2019 13:06
            -2

            он нуждается в таком

                    /**
                     * @var User $user
                     */
                    $user = Auth::user();
            


            1. tendium
              12.12.2019 17:30
              +2

              Нет, он не нуждается. По крайней мере, если сигнатура определена так:

              public static function user(): User
              {
                  // ... body ...
              }
              


            1. vp_arth
              12.12.2019 17:56

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

              Примеры:

               /** @var UserRepository $userRepo */
               $userRepo = $this->em->getRepository(User::class);
              

              Или
               /** @var User $user */
               $user = $meta->newInstance();
              


              Если это критично для вас, всегда можно выделить метод с нужной сигнатурой:
              getUserRepository(): UserRepository


              1. toratoda
                13.12.2019 08:11
                -2

                Для своего метода. Но не для вендорских?


                1. levchick
                  13.12.2019 09:41
                  +2

                  Скажите, а какой редактор/IDE может выдавать адекватные подсказки для autocomplete на метод, у которого не указан возвращаемый тип и отсутствует phpdoc?


                1. vp_arth
                  13.12.2019 10:08

                  Так я и писал про вендорские, со своими всё проще.
                  Метод getRepository — вполне себе вендорский от doctrine.

                  Использование своего адаптера для такого метода избавит Вас от необходимости помогать IDE с помощью phpdoc:

                  public function getUserRepository(): UserRepository
                  {
                      return $this->em->getRepository(User::class);
                  }
                  


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


                  1. toratoda
                    13.12.2019 11:24
                    -1

                    Это другая вариация решения той же задачи: код для того чтоб «иде понимала что я пишу».