Публикации и ответы на комментарии в блогах JetBrains не выходят на русском языке с 2022 года.

Приносим извинения за неудобства.

News Releases

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

Read this post in other languages:

Мы рады представить второй мажорный релиз 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.

type_infoGIF

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

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

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

composer_custom_reposGIF

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

composer_range-versions.сmprojGIF

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

composer_pages_linksGIF

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

composer_open_settings

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

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

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

quality_tools_docker-composeGIF

Списки исключения для 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.

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

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

multiple-projects-resolve-2019

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

multiple-projects-resolve-2020.2GIF

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

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

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

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

add_caret_actionGIF

Полная поддержка пул-реквестов 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 логи и разница коммитов отобразятся непосредственно в редакторе. Благодаря этому на экране помещается больше информации.

vcs_compare_branches

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

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

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

git-pull

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

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

git-drop-commitGIF

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

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

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

vcs_squashGIF

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

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

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

Веб

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


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

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

Будем рады вопросам, пожеланиям, баг-репортам и просто мыслям в комментариях.

Команда PhpStorm
The Drive to Develop

Оригинал статьи опубликован на habr.com:
https://habr.com/ru/company/JetBrains/blog/513250/

image description
  1. Union types в PHP 8
    1. Переключение версии языка
    2. Конвертируем PHPDoc в нативные объединенные типы
    3. Удаляем лишние PHPDoc
    4. Валидация типов
    5. Псевдотип false
    6. Дублирующиеся и избыточные типы
    7. Nullable типы
    8. Изменение типов при наследовании
  2. Новый движок потока управления
  3. Улучшения для Composer
  4. Улучшения для инструментов качества кода
  5. Инструменты командной строки
  6. Новый рефакторинг: извлечение класса
  7. И еще для PHP
  8. Полная поддержка пул-реквестов GitHub
  9. Поддержка OpenAPI
  10. Новый виджет инспекций
  11. Контроль версий
  12. Инструменты БД
  13. Веб

Discover more