company_banner

PhpStorm 2020.2: объединенные типы PHP 8, новый движок потока управления, пул-реквесты GitHub, OpenAPI



    Привет, Хабр! Рады представить второй мажорный релиз PhpStorm в этом году!

    Под катом подробный разбор всех заметных изменений и новых возможностей. Осторожно — много картинок.

    Union types в PHP 8


    В PHP 8 будет так много новых фич, что в какой-то степени это даже новый язык. Мы начали выкатывать поддержку восьмерки пораньше и первой большой фичей стали объединенные типы.

    Объединенные типы T1|T2|... можно использовать везде, где типы можно указывать сейчас: в аргументах, свойствах и возвращаемых значениях. В этом случае переменная может принимать один из перечисленных типов.

    Фактически объединенные типы давно используются в PHPDoc, но теперь интерпретатор действительно будет проверять их в рантайме.

    Переключение версии языка


    Чтобы увидеть все возможности, можно вручную переключить версию языка на PHP 8 в настройках Languages & Frameworks | PHP | PHP language level.

    Или если в коде уже есть использование новых фич, то тогда переключиться можно с помощью квик-фикса (Alt+Enter).

    А если версия PHP указана в composer.json, то PhpStorm подтянет ее автоматически.



    Конвертируем PHPDoc в нативные объединенные типы


    На теге PHPDoc, в котором есть объединенный тип, можно вызвать квик-фикс (Alt+Enter).



    Удаляем лишние PHPDoc


    Если PHPDoc содержал только объявления типов, то теперь его можно удалить как избыточный квик-фиксом (Alt+Enter).



    Можно ли такое удаление всегда считать безопасным и делать автоматически перед коммитом? Мы рассматриваем добавление такой возможности.

    Валидация типов


    PhpStorm и раньше умел анализировать типы и находить нарушения по информации из тегов PHPDoc. С нативными декларациями эти возможности расширились.

    Проверки делаются для всего: свойств, аргументов, возвращаемых значений.



    Это особенно полезно в сложном коде, когда нарушения не очевидны с первого взгляда.



    Псевдотип false


    Некоторые легаси функции могут возвращать false в случае ошибки. Например, так ведут себя strpos(), array_search() и еще 310 других стандартных функций.

    В этом случае можно было бы указать возвращаемый тип как объединенный, например int|bool, но по факту true там никогда не будет.

    Для таких случаев и введен псевдотип false. Его можно использовать только в объединениях. Иначе PhpStorm подсветит невалидный код.



    Дублирующиеся и избыточные типы


    Многие комбинации в объединениях типов запрещены или просто лишние. Например:

    • bool|false — потому что false входит в bool;
    • Foo|Foo или int|string|INT— повторения;
    • object|Userobject заведомо содержит все остальное;
    • iterable|array или iterable|Traversableiterable включает array и Traversable;
    • void — может использоваться только в возвращаемом значении и только сам по себе;
    • false или null — только как часть объединения.


    PhpStorm подсветит все такие нарушения.



    Nullable типы


    Прежний синтаксис ?Type теперь рассматривается как сокращение для Type|null.

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

    Для таких случаев в PhpStorm есть квик-фикс (Alt+Enter).



    Изменение типов при наследовании


    Для методов действуют два правила:

    Тип параметра контравариантен,то есть его можно расширять.



    Возвращаемый тип ковариантен, то есть можно только сужать.



    При этом порядок типов не имеет значения, и Type1|Type2 эквивалентно Type2|Type1.

    Тип свойств изменять нельзя
    Тип унаследованного свойства должен сводиться к родительскому, например:



    Новый движок потока управления


    Обновление движка потока управления позволило добавить новые инспекции и исправить многие старые баги. Как следствие, PhpStorm понимает код еще лучше.

    Кое-где можно будет заметить подсветку и предупреждения из новых инспекций. Некоторые из них могут потребовать вашего внимания как потенциальные источники багов. А исправление других просто сделает код чище.

    Вот несколько примеров инспекций.

    Переменная всегда true или false
    Пример в файле Parser.php из doctrine/orm.



    Условие всегда true
    Пример в файле FormValidator.php из symfony/form.



    Результат instanceof всегда true
    Пример в файле Logger.php from symfony/monolog-bridge.



    $this всегда будет иметь тип ResetInterface, потому что тот находится выше по иерархии.



    Выражение всегда null
    Пример в файле ProcessUtils.php from symfony/process.



    Новое действие: Type Info (⌃⇧P / Ctrl+Shift+P)
    Можно навести каретку на любое выражение и вызвать это действие, чтобы посмотреть, какой тип PhpStorm вывел для выражения. Доступно из меню View | Type Info или по горячей клавише ⌃⇧P / Ctrl+Shift+P.



    Улучшения для Composer


    C версии 2020.1 все действия с зависимостями Composer можно производить непосредственно в PhpStorm в файле composer.json. В этом релизе есть несколько улучшений.

    Поддержка кастомных репозиториев Satis/Packagist
    Если указать кастомный источник в секции “repositories”, то для всех пакетов из него будет доступно автодополнение кода. Информация о пакетах и версиях будет кешироваться в PhpStorm.



    Дополнение, когда указано несколько версий
    Если версии перечислены через запятую или пайп (||), то PhpStorm теперь корректно отработает и покажет доступные варианты.



    Ссылка на код и сайт
    У каждого пакета в попапе с информацией есть ссылки на сайты.



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



    Улучшения для инструментов качества кода


    Кстати, об инструментах качества. В PhpStorm 2020.2 есть несколько полезных дополнений.

    Поддержка Docker Compose
    PHP_CodeSniffer, PHP CS Fixer и PHP Mess Detector можно запускать через docker compose.



    Списки исключения для PHP_CodeSniffer
    Если в кастомном ruleset.xml есть секция "exclude-pattern", то теперь она будет учтена и файлы по указанным путям не будут анализироваться в IDE.

    Форматирование через удаленный интерпретатор
    PHP CS Fixer и PHPCBF можно запускать с интерпретатором через SSH, Docker, Docker Compose, Vagrant и прочие.

    Инструменты командной строки


    Все команды Symfony, Laravel Artisan, Drupal Drush, WP-CLI и скрипты Composer можно очень быстро запускать в PhpStorm, не открывая терминала.

    Для этого нужно добавить соответствующий инструмент в настройках Tools | Command Line Tool Support.

    Затем по нажатию Ctrl-Ctrl появится строка Run anything, в которой и доступны все команды с автодополнением.

    Начиная с этого релиза для Symfony, Laravel и Drush даже ничего настраивать не надо. Достаточно открыть проект, нажать Ctrl-Ctrl и начать вводить команду.



    ️ Для Laravel на macOS файл artisan должен быть исполняемым (chmod +x artisan).

    Кроме того, инструменты теперь можно запускать через любые удаленные интерпретаторы (SSH, Docker, Docker Compose, Vagrant). Например, можно быстро протестировать приложение на PHP 8, добавив Docker-интерпретатор из образа php:rc-cli.

    Новый рефакторинг: извлечение класса


    Сначала классы выглядят аккуратно и чисто. Потом в них добавляются всё новые методы и свойства, и вот рано или поздно класс уже «разбух» и оброс ответственностями со всех сторон.

    Тут может помочь выделение пачки связанных методов и свойств в новый класс. Именно это и предлагает новый рефакторинг Extract Class.

    Чтобы попробовать, внутри класса надо нажать Ctrl+T и выбрать Extract Class. PhpStorm предложит ввести имя нового класса, и тут же можно выбрать еще методы и классы для извлечения.



    Этот рефакторинг работает и для обычных функций.

    И еще для PHP


    Новая инспекция: Typed property might be unassigned


    Если типизированное свойство объявлено, но не инициализировано, то при попытке его читать будет ошибка TypeError (если не определен магический __get()). PhpStorm подсветит чтение из неинициализированных свойств.



    Новая инспекция: Array used only with write access


    Пример из файла SchemaTool.php from doctrine/orm.



    Массив $pkColumns в методе gatherColumns() обновляется, но никогда не читается.

    Кастомизация генерируемых геттеров и сеттеров


    Теперь можно настроить именование методов, выбрав между camelCase() и snake_case().

    А также настроить порядок, в котором они будут добавлены в класс.

    Обе опции доступны в настройках Editor | Code Style | PHP на вкладке Code Generation.



    Правильный резолв для множества проектов в одном окне


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

    В PhpStorm 2020.2 этих ошибок нет, а переход работает как ожидается.



    Более низкий приоритет для классов из vendor


    В списке автодополнения приоритет будет отдавать классам непосредственно из проекта, и с более низким будут идти сущности из папки vendor и файлов PHAR.

    Добавить курсор на все выделенные строки


    Новое действие Add Caret Per Selected Line добавляет курсор в конце каждой выделенной строки и снимает выделение. Можно вызвать с помощью клавиш ⌥⇧G / Alt+Shift+G.



    Полная поддержка пул-реквестов GitHub


    Базовая поддержка пул-реквестов появилась в PhpStorm 2018.3. C тех пор были обновления, но для многих действий все еще необходимо было переключаться в браузер.

    В PhpStorm 2020.2 всю работу с пул-реквестами можно делать прямо в IDE!



    Перейти к пул-реквестам можно из меню VCS | Git | View Pull Requests, из тулбара или нажатием Alt+7. Первым будет виден список доступных реквестов с возможностью поиска и фильтрации.

    По клику на пул-реквесте откроется подробная информация о нем: ревьюверы, теги, измененные файлы, таймлайн.

    Весь флоу по ревью можно проделать тут же. Стартовать и запрашивать ревью, комментировать изменения на уровне строк или всего коммита, сабмитить ревью, мержить.

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

    Раньше, чтобы смержить пул-реквест, нужно было создать локальную ветку. Теперь это не требуется и мержить можно по нажатию кнопки.

    Поддержка OpenAPI


    Плагин OpenAPI Specifications доступен для всех IDE от JetBrains и работает начиная с версии 2020.2. В файлах спецификаций Open API (openapi.yaml/openapi.json и swagger.yaml/swagger.json) он предоставляет подсветку, дополнение, валидацию и навигацию.

    Кроме того, доступны следующие возможности:

    • Интеграция со Swagger UI — рендерится непосредственно в окне IDE.
    • Генерация кода.
    • Структурный diff для спек OpenAPI — позволяет быстро обнаружить значительные изменения.
    • Гаттер-иконки для быстрого создания запросов в HTTP-клиенте.
    • Дополнение ендпоинтов в HTTP-клиенте.
    • Rename-рефакторинг — если переименовать эндпойнт в спеке, то он автоматически переименуется и в запросе HTTP-клиента.




    Новый виджет инспекций


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

    При помощи стрелок можно быстро перепрыгивать к следующей/предыдущей проблеме (раньше это можно было делать клавишами F2 / Shift+F2).

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

    А по клику на виджете откроется новое окно Problems со списком всех обнаруженных проблем в файле.



    Контроль версий


    Git из WSL 2


    PhpStorm теперь умеет использовать бинарник Git из WSL. Более того, IDE сама определяет, установлен ли WSL и доступен ли Git в нем.

    Настройки доступны в Preferences | Version Control | Git.

    ️ Git будет работать только с WSL2, потому что Git из WSL1 работает нестабильно и может приводить к неправильным результатам выполнения команд Git.

    Улучшенный UI для сравнения веток


    PhpStorm позволяет сравнить любые ветки и посмотреть, какие коммиты вошли в ту или другую. Для этого нужно выбрать любую ветку из доступных в попапе VCS | Branches и в контекстном меню выбрать Compare with Current.

    В PhpStorm 2020.2 логи и разница коммитов отобразятся непосредственно в редакторе. Благодаря этому на экране помещается больше информации.



    Обновленные диалоги команд


    Диалоги для команд Git Merge, Pull и Rebase были переделаны и унифицированы. Добавлены недостающие опции, и теперь можно видеть полную команду Git, которая будет выполнена.

    Все команды доступны в меню VCS | Git.



    Новое действие: удалить коммит


    Лишний или временный локальный коммит теперь можно удалить прямо из лога в PhpStorm. Для этого в контекстном меню на коммите надо выбрать Drop Commit.



    Новое действие: объединить коммиты в один (squash)


    Также можно объединить несколько коммитов в один. Например, это может быть удобно, чтобы очистить историю перед созданием пул-реквеста или перед пушем изменений.

    В логе выделяем несколько коммитов и выбираем Squash Commits… из контекстного меню.



    Для обоих действий за кадром выполняется git rebase.

    Инструменты БД


    PhpStorm «из коробки» включает в себя почти все возможности DataGrip, которые охвачены в обзоре релиза DataGrip 2020.2 от наших коллег.

    Веб


    И, как всегда, все обновления из WebStorm 2020.2 тоже входят в PhpStorm. Например, с помощью плагина, Prettier можно использовать в качестве дефолтного форматтера в том числе и для PHP-файлов.



    Скачать PhpStorm 2020.2 можно на странице “What’s new”.

    А вот видеоролик (на английском) с демонстрацией главных фич релиза:


    На этом всё на этот раз. Спасибо, что дочитали до конца! Будем рады вопросам, пожеланиям, баг-репортам и просто мыслям в комментариях.

    Ваша команда JetBrains PhpStorm
    JetBrains
    Делаем эффективные инструменты для разработчиков

    Комментарии 42

      –8
      Объединение типов, серьезно? PHP, куда ты катишься…
      ЗЫ: Сори, к Сторму вопросов нет.
        +1

        А почему нет? Например, в тех же тестах часто есть конструкции вида MyClass|TestObject и теперь это можно законно использовать на уровне языка, а не аннотаций.

          –6
          Жалко, что архитектура языка, заявленного как язык с динамической типизацией, все больше обрастает костылями. Напоминает этот советский мультфильм.
            +7

            Сколько лет развития прошло с момента, когда считалось, что динамическая типизация — это круто?
            Как мне кажется, общество определенно поддерживает стремление к строгой типизации. И, как по мне, это очень здорово, люблю предсказуемый код.

              –1

              Не понятно зачем тогда нужен PHP когда есть в плане типов и строгости есть достойные кандидаты

                +3

                Никто не принуждает вас использовать строгую типизацию.

                  0

                  Вопрос не в принуждении, а в том куда развивается язык и в его консистентности

                    +1

                    И в чем консистентность языка страдает? В том, что одновременно с типами и без можно писать? На проекте с более чем одним разработчиком это решается линтингом.
                    Я вам не оппонирую, правда интересно разобраться, кому могут быть неудобны типы в PHP и почему.

                      0

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

                  +3

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


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


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

                    0

                    Проблема не в типах как feature, проблема в том что усидеть на двух стульях не получится. Либо гарантии как в строго типизированных статических языках (+ все накладные на работу с типами), либо type hinting который в лучшем случае что то гарантирует

                      +1

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


                      Не думаю, что язык когда-либо станет строго типизированные, поскольку это сломает обратную совместимость в куче проектов, но то, что через некоторое время типы будут применяться повсеместно, это точно. И скорее всего такой код будет работать быстрее, чем код без типов.

                    0

                    Какие из интерпретируемых ООП?

                      –1
                      Typescript, например.
                      Кроме того, я не отличу в работе Python с MyPy от PHP 8 (первый будет даже выразительнее). Правда, Python комьюнити намного хуже относится к типизации, чем РНР. Поэтому более вероятно подключить библиотеку без меток типов.
                      Впрочем, РНР в чем-то уникален — runtime проверки типов. Это допускает запуск с некорректными системе типов состояниями, но убирает возможность их появления.
                        +1

                        TypeScript как язык строго компилируемый, не так ли?

                        0

                        А почему именно интерпритируемые? Вам шашечки или ехать, хотите корректности и проверки на уровне типов, gcи тд — берите java,c# etc. Нужна динамика и строгость + функциональная парадигма, а еще что бы работа с многопоточностью из коробки — берете elixir, erlang. Как говорится best/right tool for the job

                          0

                          Потому что это удобно.


                          А, как показывает практика, проверк атпов вполне работает в рантайме, а не только в компайлтайме.

                0
                2020 продолжает удивлять
                +6

                "Строгая" типизация, пришедшая в PHP 7.4 больше добро, чем зло. Мы рефакторили легаси проект, который был написан во времена PHP 5.2 и 7.4 с ее типизацией очень сильно помогла. К примеру, мы знаем, что в этом свойстве будет int, тут будет объект, функция может вернуть только определенный объект и все это без PHPDoc.


                Если проект крупный, то строгая типизация лично мне помогает быстрее понять суть.


                Жаль, что в PHP 8 не будет точно такого же синтаксиса обобщений, как в Java или C#.

                  0
                  Жаль, что в PHP 8 не будет точно такого же синтаксиса обобщений, как в Java или C#.
                  Не самого интересного, по-моему (не то, что я их хорошо знаю, но вроде там простой как валенок).
                  Пусть будет синтаксис, как в Typescript.
                  0
                  С переходом с 2019.3 на 2020.1 шторм стал жутко тупить. Так что пользоваться им было практически невозможно.
                  Подскажите, в 2020.2 глюки с 2020.1 тоже перенесли или стоит попробовать обновится?
                    +1
                    Не вот этот баг, часом? Если оно — то это рантайм, который можно поменять в < 2020.1.3 парой ударов по бубну. В 2020.1.3 вроде поправили, в 2020.2 не замечал пока.
                      0
                      Да, симптомы сходятся. Спасибо за информацию.
                    +1
                    Был очень рад, когда объявили поддержку OpenAPI.
                    Но после тестов разочаровался. Автодополнение работает не везде и местами странно (например в $ref:). Нет поддержки $ref на другие файлы — без этого весь плагин бесполезен. Разве что у вас в проекте пару эндпоинтов. Пока остаюсь на другом плагине.
                      0

                      А меня обрадовало что починили наконец иконку закрытия табов редактора.
                      Наконец можно обновить на 2020.

                        0
                        Список изменений внушительный, хорошая работа!

                        Из личного опыта:

                        1. окно IDE при открытии файла из проводника в Windows всё также не фокусится
                        2. очень хочется пункт Show in Project в меню таба редактора (про иконку мишени уже знаю)
                          +1

                          есть хоткей Alt+F1,1 выполняет ту же функцию.

                          0
                          Перестал знать стандартные функции пхп. Файл на месте /snap/phpstorm/current/plugins/php/lib/php.jar
                            0
                            Мы пока не понимаем, почему это происходит. Судя по всему, стопроцентно помогает ручной снос папки idea.system.path/caches, но не File | Invalidate Caches / Restart | Invalidate and Restart.
                            0

                            Нет в меню vcs->git show pull requests

                              0

                              Возможно вы открыли проект в котором нет remote на github?


                                0
                                есть :), у меня в этом меню ниже ребейза нет пунктов. версия:
                                PhpStorm 2020.2
                                Build #PS-202.6397.115, built on July 29, 2020
                                Licensed to ********
                                You have a perpetual fallback license for this version
                                Subscription is active until August 1, 2021
                                Runtime version: 11.0.7+10-b944.20 amd64
                                VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
                                Linux 5.4.0-42-generic
                                GC: ParNew, ConcurrentMarkSweep
                                Memory: 1936M
                                Cores: 6
                                Current Desktop: ubuntu:GNOME
                                  0
                                  Если у вас git remote -v в этом проекте действительно показывает ремоут на GitHub, и плагин GitHub не выключен в Settings | Plugins | Installed, то надо смотреть детально. Отправьте пожалуйста логи (Help | Collect Logs and Diagnostic Data) в Help | Contact Support.
                                  +1
                                  Ожидается ли поддержка такого функционала для Gitlab? Нашел несколько issues, но открыты они были давно или и без ответа.
                              0

                              Пропал автокоплит поиска ветки при git pull, я не одинок в этом ?

                                0
                                Комплишена как будто бы и раньше не было, в 2020.1 в диалоге в принципе не было поля для ввода имени ветки. Но я не вижу причин не сделать комплишен, поэтому вот.
                                Caarl Извиняюсь, я промахулся с комментарием, сообщение предназначалось вам.
                                  0

                                  Помогло, большое вам спасибо !

                                  0
                                  После обновления на 2020.2 «залипает» проверка php кода через CS, т.е. IDE подчеркивает ошибку вроде «phpcs: Function closing brace must go on the next line following the body; found 1 blank lines before brace» — исправляешь, а ошибка остается на месте, пока файл не переоткроешь.
                                    0
                                    А у вас всё-всё локальное, и сам проект (в том смысле, что это не замаученная шара или что-то такое), и сам PHP_CodeSniffer?
                                    Если так, помогает ли File | Reload All from Disk?
                                      0
                                      А, кажется я наткнулся на эту проблему на нашем трекере: youtrack.jetbrains.com/issue/WI-53963
                                      Ждём, пока разработчик перенесёт фикс в 2020.2.
                                        0
                                        у меня в логе такой ошибки нет, пытался записать скринкаст, но баг какой-то плавающий

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

                                    Самое читаемое