PhpStorm 2021.2: дженерики, перечисления, array shapes, новые инспекции и рефакторинги
Вышел второй мажорный релиз PhpStorm в этом году. Под катом подробный разбор всех изменений и новых возможностей с кучей гифок.
Скачать PhpStorm можно на сайте или через приложение Toolbox App.
Как и раньше, для тех, кто занимается опенсорс-проектами, а также для студентов и преподавателей есть бесплатные лицензии. Также предлагаем скидку для стартапов.
PHP
IDE
Контроль версий
Code With Me
Поддержка дженериков
Дженерики остаются одной из самых желаемых фич PHP, судя по результатам опроса JetBrains Developer Ecosystem. И тем не менее на данный момент планов их реализовать на уровне языка нет.
В этом релизе мы добавили поддержку нескольких основных сценариев использования дженериков через PHPDoc-аннотации. Этот подход был популяризирован инструментами статического анализа Psalm и PHPStan.
Коллекции и template
Одним из самых популярных применений дженериков являются коллекции. В отличие от обычных массивов такой подход дает меньше ошибок, улучшает подсветку и автодополнение кода.
Вот простейшая реализация коллекции с помощью тега @template
:
Для коллекций Doctrine (doctrine/collections) в простых сценариях теперь работает автодополнение:
2021.2 не поддерживает автодополнение элементов в цикле foreach
для интерфейса Collection
. Этот сценарий уже реализован, но появится в одном из следующих минорных обновлений. Можно подписаться на тикет WI-61438, чтобы получать уведомления.
Поддерживаются только дженерики первого уровня
Это значит, что PhpStorm будет выводить типы и делать автодополнение только для тегов вида Base
или Base
.
А вот вложенные дженерики вида Base
не поддерживаются, и, скорее всего, не будут поддерживаться в будущем из-за накладных расходов на производительность.
@class-string
Еще одно применение дженериков — фабрики. Они часто принимают строку с именем класса в качестве аргумента и возвращают объект.
Если вы аннотируете параметр тегом @class-string
, то PhpStorm предоставит вам соответствующий вывод типа:
Вообще, если вы используете оператор new
для инстанцирования объекта из параметра, то можете не добавлять аннотацию @class-string
— все будет работать и без нее:
Что дальше?
Планируем постепенно покрыть еще несколько важных сценариев использования дженериков. Например, вот эти:
- WI-56034 Support the use of generics on classes
- WI-60894 Support parameter wrapping
- WI-61497 Generics template @implements should inherit annotations from the interface
- WI-60895 Infer generic type from constructor
Основной тикет по дженерикам WI-47158 мы закроем, а работу продолжим уже по каждому конкретному кейсу в рамках отдельных тикетах.
Если вы обнаружили не покрытый кейс, создайте, пожалуйста, для него тикет в нашем трекере.
PHP 8.1
Выход новой версии интерпретатора ожидается в конце ноября. А мы по традиции начинаем выкатывать поддержку пораньше.
Одной из самых значимых и ожидаемых фич PHP 8.1, конечно же, будут перечисления (enum).
Перечисления
Объявить перечисление можно ключевыми словами enum
и case
. Поскольку фича новая и синтаксис может запомниться не сразу, PhpStorm поможет вам автодополнением и подсветит ошибки синтаксиса языка.
Перечисления можно использовать в объявлениях типов (тайпхинтах) параметров, возвращаемых значений и свойств класса.
PhpStorm отследит любые ошибки, связанные с использованием типов, и подсветит их в редакторе.
Новые значения в перечислениях (cases) можно создавать с помощью специального квик-фикса: переставьте указатель туда, куда хотите добавить использование нового кейса, введите его, а затем нажмите Alt+Enter и выберите Add enum case.
Backed enums
По умолчанию кейсы в перечислениях — это простые синглтон-объекты. Но если вы хотите сохранить их в базе данных, то можете определить для них скалярные значения.
Перечисления со скалярными эквивалентами для кейсов, называются backed enums.
Если вы объявили стандартное перечисление (unit enum) и затем решили сделать из него backed enum, то можно нажать Alt+Enter на подчеркнутых кейсах и добавить декларацию типа для всего перечисления.
Кстати, перечисление можно назватьEnum
, потому что оно определено как контекстное ключевое слово. И поэтому, если вы использовали какие-либо пакеты с реализацией перечислений через классы, то конфликтов не возникнет — можно переключиться на PHP 8.1 и потом мигрировать.
В перечислениях можно объявлять свои методы, но нельзя объявлять конструкторы, деструкторы и магические методы (кроме __call
, __callStatic
, и __invoke
). Также нельзя объявлять свойства и динамические свойства. Все эти нюансы PhpStorm проверит и, если что не так, подсветит ошибки.
Это все по перечислениям. Будем рады вашим идеям по возможным улучшениям!
Поддержка синтаксиса аrray shape в PHPDoc
Иногда может быть удобнее работать с данными в структурированных ассоциативных массивах. Однако при этом в PhpStorm переставала работать подсветка и автодополнение для ключей и значений.
В этом релизе добавили поддержку PHPDoc-синтаксиса для описания структуры массивов. Это значит, что для ключей будет автодополнение, а для значений определен их тип.
Поддержка работает только для однострочных определений. Многострочные и вложенные определения array shape не поддерживаются.
В качестве альтернативы можно использовать атрибут #[ArrayShape]
. Доступен начиная с версии PhpStorm 2020.3 и среди его преимуществ: более красивая подсветка синтаксиса, поддержка многострочности, а также возможность использовать константы для описания структуры.
Улучшенное форматирование кода
Долгое время в PhpStorm были мелкие недоработки по части форматирования. В большинстве случаев оно работало как надо, но недоработки порой могли очень раздражать.
В PhpStorm 2021.2 исправили проблемы с форматированием — теперь оно всегда работает правильно и предсказуемо!
Чтобы отформатировать код, нажмите Ctrl+Alt+L. Вы можете применить форматирование только к выделенному коду либо ко всему файлу сразу.
Все настройки стиля кода доступны в разделе Settings/Preferences | Editor | Code Style | PHP.
Некоторые функции PhpStorm было сложно использовать из-за проблем с форматированием. Например, были проблемы при разделении списков на отдельные строки / объединении их в одну строку. Теперь все будет работать как надо.
Для массивов, списков аргументов и списков параметров теперь можно нажать Alt+Enter и выбрать опцию Split comma-separated values into multiple lines:
Вы можете выбрать способ выравнивания элементов списка. Например, для параметров с тайпхинтами можно выровнять типы и имена по столбцам:
Если вы обнаружите косяк с форматированием, который мы упустили, сразу создайте тикет в нашем баг-трекере.
Новые инспекции и квик-фиксы
В каждом релизе мы добавляем пачку новых инспекций, позволяющих предотвратить возможные баги или оптимизировать код.
Вот некоторые из них.
Условие можно заменить оператором `?→`
Эта проверка находит выражения, которые можно заменить nullsafe-оператором из PHP 8. Нажмите Alt+Enter, чтобы выполнить замену.
Использование константы из класса, в котором она определена
PhpStorm подсветит константы, которые читаются через дочерний класс или интерфейс, а не через тот, где они объявлены. Заменить имя сущности можно нажав Alt+Enter.
Избыточное условие в логическом выражении
Теперь PhpStorm будет проверять все части составных условий, чтобы выявить лишние.
Вот простой пример:
А вот менее очевидный:
Инспекции Refactoring opportunities
Добавили новую группу проверок в Settings/Preferences | Editor | Inspections.
В эту группу входят инспекции, которые помогают находить хорошие кандидаты для рефакторинга. По умолчанию они отключены, но вы все равно будете видеть специальную иконку на полях редактора . Если на нее нажать, вам будет предложен соответствующий рефакторинг.
Вот три примера.
Complex class should be refactored
Эта проверка находит раздутые классы полагаясь на три метрики: мера сцепленности класса (Tight Class Cohesion, TCC), сумма цикломатических сложностей для всех методов в классе (Weighted Method Count, WMC) и количество полей другого класса, к которым обращаются в данном классе (Access To Foreign Data, ATFD).
Когда PhpStorm обнаруживает раздутый класс, он предлагает извлечь методы в новый класс. Если исходный класс слишком велик, может потребоваться еще несколько итераций рефакторинга.
Complex function should be refactored
Эта проверка вычисляет четыре метрики для метода: цикломатическую сложность, глубину вложенности, количество используемых переменных и суммарное количество строк.
Если общая оценка метода низкая, то, вероятно, есть смысл разделить его на более простые, более управляемые части.
PhpStorm предлагает несколько блоков, которые можно извлечь в новый метод.
Method has Feature Envy of another class
Когда метод обращается к данным другого объекта чаще, чем к своим собственным данным, это признак Feature Envy.
Возможно стоит перенести метод или его часть в другой класс.
В группе Refactoring opportunities есть еще несколько инспекций, их описания можно изучить в настройках.
Улучшение рефакторинга Extract Method
Extract Method доступен в PhpStorm с 2011 года и является одним из самых используемых рефакторингов.
Проблема: предположим, у вас слишком большой метод, и вы хотите разбить его на несколько маленьких. Или вы хотите устранить дублирование кода.
Решение: переместить часть кода в новый метод и заменить старый код вызовом метода.
Чтобы использовать этот рефакторинг, выделите фрагмент кода и нажмите Cmd+Alt+M / Ctrl+Alt+M.
Теперь давайте рассмотрим улучшения Extract method в PhpStorm 2021.2.
Рефакторинг для дублирующегося кода
Инспекция Duplicated code fragment позволяет находить повторяющиеся фрагменты кода.
Она была доступна и ранее, но теперь добавили квик-фикс для рефакторинга такого кода.
Инспекция подсветит только первую найденную строку. Поставьте на нее курсор, нажмите Alt+Enter и вызовите Extract Method from duplicate code.
Все повторяющиеся фрагменты будут заменены вызовом нового метода.
Обнаружение дубликатов во время рефакторинга
PhpStorm находит более мелкие дублирующиеся куски в текущем скоупе (метод, класс, файл) непосредственно во время рефакторинга. В версии 2021.2 этот процесс обнаружения стал намного умнее.
Выделите кусок кода и вызовите рефакторинг с помощью ⌘⌥M (Cmd+Alt+M / Ctrl+Alt+M). При обнаружении дубликатов, в нижней части диалога вы увидите чекбокс Review and replace duplicates.
Дубликаты будут найдены, даже если код не полностью идентичен, но схож по сути.
Новый умный селектор для фрагментов кода
Если попытаться вызвать Extract Method, не выделив ничего в редакторе, PhpStorm предложит список фрагментов кода, которые можно извлечь. Это могут быть простые выражения или целые блоки.
PhpStorm не выделит фрагмент кода, если его извлечение недопустимо или бессмысленно. В примере ниже выражение присваивания пропускается — вы можете извлечь только его правую часть.
Улучшение Expand selection
Вы наверняка уже знаете, что можно выделять фрагменты кода с помощью горячей клавиши Expand / Shrink selection ⌥+Up / ⌥+Down (Ctrl+W / Ctrl+Shift+W). Это один из способов быстро выделить код для рефакторинга.
В PhpStorm 2021.2 немного обновили это действие — теперь вы можете выбирать блоки, исключая фигурные скобки.
Автоматическое именование для извлеченных методов
PhpStorm 2021.2 пытается решить одну из самых сложных проблем в компьютерных науках — именование.
Когда вы используете рефакторинг Extract Method, PhpStorm предложит имя для нового метода.
Иногда это будет просто extracted, как и раньше, но в некоторых случаях PhpStorm предложит осмысленные имена на основе используемых переменных.
Если у блока кода есть комментарий, то PhpStorm учтет его при генерации имени для извлеченного метода.
IDE
Действия при сохранении кода
В PhpStorm и раньше позволял настроить действия, срабатывающие при нажатии Cmd+S / Ctrl+S. В этой версии переработали все существующие функции и собрали их в одном месте.
Теперь все опции доступны в разделе Preferences / Settings | Tools | Actions on Save. Перечисленные здесь действия можно включить в перечень действий, вызываемых при нажатии на Cmd+S / Ctrl+S.
Просто установите галочку рядом с названием нужных действий. Большинство действий будет активироваться при любом сохранении, включая автосохранение. Для действий типа «File Watcher» и «Upload to default server» вы можете выбрать один из двух вариантов активации.
Изменение иконки проекта
Добавили небольшую, но приятную фича, которая поможет улучшить внешний вид проектов на экране приветствия.
Теперь стало проще установить иконки для проектов. Для этого щелкните правой кнопкой мыши на любом проекте и выберите в контекстном меню Choose project icon.
Улучшения scratch-файлов
С помощью scratch-файлов можно делать заметки и писать черновой код вне контекста проекта. Чтобы создать новый scratch-файл, нажмите Ctrl+Shift+N.
В это релизе теперь можно выделить нужный код, нажать Alt+Enter, и выбрать Create new scratch file from selection.
Кроме того, теперь PhpStorm автоматически удаляет пустые файлы, как только вы их закрываете, чтобы помочь вам соблюдать порядок.
Настраиваемый каталог для scratch-файлов
Вы можете настроить папку для хранения scratch-файлов. По умолчанию это каталог конфигурации IDE, но можно указать расшаренную по сети папку и использовать одни и те же scratch-файлы на разных компьютерах.
Для этого необходимо указать опцию командной строки:
-Didea.scratch.path/scratches=
Улучшения в диалоге настроек
В настройках появился новый раздел Advanced Settings. Он содержит некоторые дополнительные параметры конфигурации. Большинство из них были перенесены из Registry.
Там же вы найдете некоторые новые параметры, например, возможность установить отступ слева в режиме Distraction-free mode.
Планируем переносить редко используемые настройки в этот раздел, чтобы сделать основные настройки чище.
Кроме того, теперь можно перемещаться вперед и назад между настройками с помощью стрелок в правом углу окна.
Автоматическая очистка папок с кэшем и логами
Раньше файлы логов и кэша PhpStorm со временем начинали занимать значительное количество места на жестком диске.
Теперь с каждым мажорным обновлением PhpStorm будет автоматически очищать все каталоги кэша и логов, которые не обновлялись более 180 дней.
Можно запустить очистку вручную из главного меню: Help | Delete Leftover IDE Directories….
Быстрый доступ к режиму Power Save
Не секрет, что иногда загрузка CPU при использовании PhpStorm может быть довольно высокой. В основном это происходит во время индексирования. Мы специально используем много ресурсов при индексировании, чтобы максимально ускорить его.
Если вы работаете на ноутбуке без питания и хотите сохранить заряд для нескольких дополнительных часов автономной работы, предлагаем использовать режим Power Save.
Переключиться в режим Power Save можно из статус-бара. Найдите значок батареи или щелкните правой кнопкой мыши в правом нижнем углу статус-бара, и вы найдете опцию Power Save в списке.
Если вы работаете без статус-бара, включить энергосберегающий режим можно в меню File | Power Save Mode.
При включении режима энергосбережения синтаксические ошибки все равно будут подсвечиваться и вам будут доступны все возможности редактора. Но индексирование и некоторые проверки кода, требующие больших затрат CPU, не будут выполняться.
Переключать режим очень легко — вы сможете возвращаться в обычный режим на пару минут, чтобы выполнить нужные проверки, а затем возвращаться в режим энергосбережения.
Если вы заметили какие-либо странности, связанные с загрузкой процессора, сделайте снэпшот процессора и поделитесь им с нашим саппортом.
Вот инструкция о том, как это сделать.
Контроль версий
Единообразное поведение для Show Diff
Теперь вы можете просмотреть дифф изменений файла прямо во вкладке редактора.
Если вам удобнее отслеживать изменения в отдельном окне, вы вынести нужный файл в отдельное окно. При этом PhpStorm запомнит, что вы это сделали, и будет открывать последующие диффы в отдельном окне.
GPG-подписи для Git
Теперь можно подписывать Git-коммиты с помощью GPG. Настроить это можно в разделе Preferences/Settings | Version Control | Git.
Текстовый поиск по версиям Local History
Локальная история может выручить, если вы сделали последовательность изменений и не зафиксировали их в системе контроля версий.
Чтобы просмотреть локальную историю файлы, щелкните правой кнопкой мыши по названию файла и выберите Local History | Show History.
Теперь в этом окне есть поле поиска, с помощью которого можно найти нужное изменение.
Запуск тестов перед коммитом
PhpStorm и раньше умел автоматически выполнять различные действия перед коммитом.
В PhpStorm 2021.2 появилась еще одна опция — Run Tests.
Нажмите на значок шестеренки в Commit view, выберите опцию Run Tests и выберите нужную Run-конфигурацию из списка. PhpStorm запустит тесты и уведомит вас, если что-то пойдет не так.
Также теперь вы можете настроить параметры для Analyze code и Cleanup. Для этого нажмите кнопку Choose profile рядом с ними.
Вы сможете следить за ходом и результатами проверок в области Commit — PhpStorm не будет отвлекать вас дополнительными модальными окнами.
Code With Me
Code With Me — это инструмент для парного программирования, который поставляется в PhpStorm из коробки. В этом выпуске он был улучшен множеством дополнительных функций и обновлений. Обо всех изменениях можно прочитать в отдельном посте про Code With Me 2021.2.
Демонстрация экрана (Screen Sharing)
Одна из самых желанных фич для Code With Me теперь доступна в 2021.2 — теперь вы можете расшарить окно PhpStorm или весь экран.
Инструменты для работы с БД
PhpStorm включает встроенные возможности DataGrip. Подробнее обо новых возможностях DataGrip читайте в обзоре релиза DataGrip 2021.2 от наших коллег.
Веб-разработка
И как всегда, в PhpStorm вошли все обновления из WebStorm 2021.2.
А вот видеоролик (на английском) с главными фичами нового релиза:
На этом пока все. Будем рады вашей обратной связи — вопросам, пожеланиям, баг-репортам и просто мыслям. Оставляйте их в комментариях ниже.