
Привет, Хабр! Рады представить первый мажорный релиз PhpStorm в этом году!
Под катом подробный разбор всех заметных изменений и новых возможностей. Осторожно — много картинок.
Скачать PhpStorm 2020.1 можно на сайте или с помощью Toolbox App. Там же 30-дневная пробная версия. Все продукты JetBrains доступны бесплатно для студентов и разработчиков опенсорсных проектов.
Поддержка composer.json
Все действия по работе с зависимостями теперь доступны непосредственно в файле
composer.json
и работают прямо в редакторе.Создать новый файл composer.json можно из контекстного меню или горячей клавишей
Ctrl(⌘)+N
. Шаблон этого файла находится в настройках Preferences/Settings | Editor | File and Code Templates.
Управление зависимостями
Чтобы добавить зависимость, достаточно просто начать писать имя вендора и пакета, и появится список автодополнения с подходящими вариантами.

В поле версии будут предложены доступные версии этого пакета. Пока карет (^) или другой символ для указания диапазона версий придется добавлять вручную, но в следующих выпусках мы это исправим.
Для требований по версии PHP или наличия расширений автодополнение тоже будет работать.
Обновление и установка пакетов
Если файла
composer.lock
еще нет и пакеты не установлены, то PhpStorm будет подсвечивать название секции require
и require-dev
. Чтобы установить их, можно нажать кнопку Install в тулбаре над редактором. Или воспользоваться быстрым действием по нажатию Alt(⌥)+Enter
и выбрать Install packages.

А вот если установлены не все пакеты, то PhpStorm подсветит недостающие. Тогда
Alt(⌥)+Enter
можно вызвать на любом из них и выбрать Update package или Update all packages.Рядом с указанным требованием по версии серым будет написана версия пакета, которая реально установлена. А во всплывающем диалоге для пакетов будет информация с packagist.org о числе скачиваний и звездочек.

Всю информацию о пакетах и их версиях PhpStorm берет с packagist.org и кеширует.
Навигация к файлам и папкам
Наверняка вы знаете, что по нажатию
Ctrl(⌘)+Click
и Ctrl(⌘)+B
можно переходить к определению сущностей или искать их использования.В
composer.json
это тоже будет работать. Если нажать Ctrl(⌘)+Click
на пакете, то соответствующая директория будет подсвечена в Project Tree. А если на файле, то он будет открыт в редакторе.
Нажатие
Ctrl(⌘)+Click
или Ctrl(⌘)+B
на любой ссылке в composer.json
ожидаемо откроет ее в браузере.Автодополнение в секциях autoload(-dev)
Для неймспейсов и путей работает автодополнение на основе информации из классов и структуры директорий проекта.

Ctrl(⌘)+Click
и Ctrl(⌘)+B
для перехода к файлам и папкам здесь тоже работает.Улучшения для скриптов
Во-первых, таким же образом работают переходы к файлам/папкам/методам. Во-вторых, поддерживаются алиасы для команд. И, в-третьих, скрипты можно запускать из редактора нажатием кнопки [play] напротив имени скрипта.
При этом автоматически создается Run-конфигурация. Это значит, что повторно запускать скрипт можно горячей клавишей
Ctrl(⌃)+R
, что довольно удобно при отладке:
Установка инструментов качества кода
Если в dev-зависимостях есть
FriendsOfPHP/PHP-CS-Fixer
, то PhpStorm проверит, включена ли соответствующая инспекция и установлен ли набор правил. Если нет, можно будет вызвать Alt(⌥)+Enter
, чтобы всё исправить:
Улучшения вывода типов PHP
Движок вывода типов — это основа PhpStorm, и в этой версии в нем было сделано несколько заметных изменений.
Подсветка лишних тегов var
Добавлять теги
@var
— хороший способ подсказать PhpStorm тип переменной. Но мы постоянно улучшаем вывод типов, и некоторые такие объявления вполне могут оказаться избыточными, т. к. PhpStorm уже знает тип переменной.Такие случаи будут подсвечены, и их можно удалить с помощью квик-фикса
Alt(⌥)+Enter
-> “Remove var”:
Отслеживание null-типов — сложная задача, и были места, где PhpStorm не справлялся. Теперь в 2020.1 PhpStorm знает, когда переменная может быть null, а когда нет.
Вот примеры:

Автодополнение для инициализированного массива
Допустим, у вас есть массив с известными элементами, и позже вы пытаетесь итерироваться по нему. Раньше здесь не работало автодополнение, так как информация о типе терялась В 2020.1 всё работает:

Автодополнение в array_map/array_filter
В теле замыкания, которое передано в функции array_map() и array_filter(), теперь работает дополнение для аргументов.

Покрытие кода с помощью PCOV и PHPDBG
Строить покрытие кода можно с помощью Xdebug. Но поскольку это прежде всего отладчик, то у него есть приличные накладные расходы. Чтобы ускорить получение отчета о покрытии, можно использовать более легковесные инструменты: расширение krakjoe/pcov или встроенный в PHP 5.6+ PHPDBG.
Оба теперь поддерживаются в PhpStorm. Нужно создать Run-конфигурацию для тестов и в настройках выбрать желаемый драйвер покрытия. Затем запустить тесты с подсчетом покрытия нажав кнопку


Подробнее о различиях в подсчете покрытия между Xdebug, PCOV, and phpdbg можно прочитать в README.
Инструментарий PHPUnit
В недавно вышедшем PHPUnit 9 (и уже 9.1) много возможностей было удалено или объявлено устаревшими. Чтобы ускорить миграцию и предотвратить ошибки, мы добавили пачку инспекций и квик-фиксов.

Создать новый тест для класса
Вызвав
Alt(⌥)+Enter
на объявлении класса и выбрав Create New PHP Test можно быстро получить скелет для теста.
Метаданные
Метаданные в файле
.phpstorm.meta.php
позволяют предоставить PhpStorm дополнительные сведения о вашем проекте и тем самым улучшить автодополнение кода. Например, эта возможность используется в плагине Symfony и в Laravel IDE Helper.Больше о возможностях метаданных можно узнать из доклада PHP как инструмент разработки PhpStorm на PHP Russia 2019.
В PhpStorm 2020.1 добавлен ряд улучшений для метаданных.
Индекс параметра в директивах override, map, и type
Раньше с помощью
override()
, map()
, и type()
можно было изменить поведение первого аргумента функций. В PhpStorm 2020.1 можно указать произвольный индекс параметра:
Доступ к свойствам через __get
Если вы получали значения свойств через магический
__get()
, то информация о типе терялась. Можно было использовать дополнительные теги @var
или @property
, но не всегда это спасало. Теперь можно указать всё через метаданные.
Автодополнение ключей в объектах, реализующих ArrayAccess
Метаданные поддерживали объекты ArrayAccess, но подсказывали только тип значений. Теперь возможные ключи тоже автодополняются.

Кастомные точки выхода
PhpStorm рассматривает функции типа
die()
и exit()
или бросание исключений как завершающие выполнение. Но в приложениях могут быть более сложные точки выхода. Например, простая dd()
или функция trigger_error с аргументом E_USER_ERROR.В PhpStorm 2020.1 можно помечать функции как точки выхода, и это соответствующим образом скорректирует анализ потока выполнения.

Иконки для функций, переопределенных через метаданные
Напротив объявлений функций, чье поведение было изменено с помощью
override()
, exitPoint()
или expectArguments()
, будет отображаться иконка. Нажатие иконки откроет файл .phpstorm.meta.php
, в котором и меняется поведение, т. к. файлов может быть несколько.
Иконки можно спрятать в Preferences/Settings | Editor | General | Gutter Icons.
Машинное обучение для сортировки списка дополнений
Добавили ранжирование вариантов автодополнения на основе машинного обучения.
Как увидеть ML в действии?
По умолчанию автодополнение с ML отключено.
Если еще включить опцию Show position changes in completion popup, то тогда в списке автодополнения будет показано, как именно изменился порядок элементов.

Мы планируем
Новые инспекции
Приватное свойство может быть локальной переменной
Определение свойства будет подсвечено, если оно используется только в одном методе и сразу же в нем перезаписывается. Чтобы исправить, можно вызвать квик-фикс
Alt(⌥)+Enter
“Replace property with local variable”.
Лишняя инициализация свойства
Допустим, в классе у приватного свойства есть значение по умолчанию, но в конструкторе оно сразу же перезаписывается другим значением. В этом случае значение по умолчанию является избыточным и добавляет только шум.
Неиспользуемый инициализатор будет подсвечен, и его можно удалить квик-фиксом
Alt(⌥)+Enter
“Remove redundant initializer”.
Изменить тип свойства в PHP 7.4 в соответствии со значением по умолчанию

Избыточный тернарный оператор
PhpStorm подсветит тривиальные тернарные выражения и с помощью квик-фикса
Alt(⌥)+Enter
их можно заменить на более простые:
Избыточная передача по ссылке
Использование передачи по ссылке может привести к неожиданным последствиям, и это одна из причин, по которой Никита Попов предложил разрешить явную передачу по ссылке при вызове функций в PHP.
Ну а пока, PhpStorm 2020.1 подсветит параметры объявленные как передаваемые по ссылке, но при этом не используемые в качестве таковых. Их можно безопасно удалить квик-фиксом
Alt(⌥)+Enter
.
То же самое будет работать и для массивов со ссылкой в foreach-цикле:

Удалить лишний PHPDoc, в котором только объявление типов теперь тоже довольно просто благодаря соответствующему квик-фиксу.

Правда, по умолчанию инспекция стоит на уровне Info, то есть подсвечивать не будет. Если вы хотите, чтобы лишние блоки PHPDoc подсвечивались, то для инспекции Redundant PHPDoc comment в Preferences | Editor | Inspections установите уровень Weak Warning или выше.
Обновленный рефакторинг “Move method”
Иногда может быть необходимо перенести метод в другой класс. Если этот метод используется много раз в коде проекта, то PhpStorm может тут помочь.
Раньше сначала нужно было сделать метод статическим, а потом уже вызвать еще одно действие, чтобы перенести его. В PhpStorm 2020.1 рефакторинг “Move method” переработан в одно атомарное действие. Убрали лишние шаги и попапы, и всё делается за один раз.
Наведите курсор на метод и нажмите
F6
(или Ctrl+T
, 3
). Затем выберите целевой класс и всё готово.
Чтобы посмотреть все доступные рефакторинги, можно нажать Ctrl+T
в любом месте кода.
PHP Debug in HTTP Client
Теперь, чтобы выборочно включать отладку, не нужно возиться с параметрами запроса или ставить расширение в браузере. Достаточно создать HTTP-запрос в файле
.http
и отправить его командой PHP Debug, которая доступна в меню Alt(⌥)+Enter
или по нажатию иконки. В результате к запросу будет автоматически добавлена кука XDEBUG_SESSION
.
И еще несколько мелочей для PHP
@deprecated-элементы отображаются как
Ctrl(⌘)+F12

Подсветка совпадающих тегов <?php / ?>

Прыжок к открывающей/закрывающей скобке
Shift+Ctrl+M (⌃+M)

Кастомизация Lexer для Twig
Иногда может понадобиться изменить символы тегов для шаблонов Twig, например если используется еще и Angular, у которого такой же синтаксис.
Сделать это можно в настройках Preferences/Settings | Languages & Frameworks | PHP | Twig.
IDE
Продвинутый корректор правописания и грамматики Grazie
В PhpStorm из коробки включен плагин Grazie, которые проверяет текст не только на орфографические ошибки, но также на грамматику и стиль. Причем поддерживаются 16 языков, и все проверки выполняются локально без отправки ваших данных куда-либо.

По умолчанию проверки включены для Markdown-файлов.
Можно включить их также для всех строковых литералов, комментариев, блоков PHPDoc и сообщений коммитов.
Для PHP включить можно в Settings/Preferences|Editor | Proofread | Grammar.
Режим LightEdit
Иногда бывает нужно быстро посмотреть/поправить файл и открывать для этого целую IDE кажется слишком, но привычную подсветку и функции иметь хочется. Именно для таких случаев мы работаем над легковесным режимом LightEdit.
Работает это так: если вы открываете файл из командной строки или контекстного меню операционной системы, при этом PhpStorm не запущен, то файл откроется в LightEdit. Ну а если полноценный PhpStorm уже работает, то файл просто откроется в нем.

JetBrains Mono — шрифт по умолчанию

Режим Zen
Новый режим сочетает в себе Distraction Free и Fullscreen для глубокого погружения в код.
View | Appearance | Enter Zen Mode

Интерфейс
Разделение окна терминала
Вместо открытия новых вкладок и переключения между ними, теперь можно разделить экран и открыть несколько сессий в одной вкладке. Для этого из контекстного меню терминала выбрать Split Horizontally / Vertically.

Тема IntelliJ Light
Светлая тема немного обновлена и унифицирована, чтобы выглядеть одинаково на всех ОС, а ее название сменилось на IntelliJ Light.
Кастомизация статусбара
Из контекстного меню можно выбрать, какая информация будет на нем отображаться.

Конфигурация
Унифицированная конфигурация SSH
Раньше, если SSH-подключение переиспользовалось в деплойменте, Remote-интерпретаторе или SSH-терминале, его каждый раз приходилось конфигурировать заново.
Теперь все SSH-подключения можно добавлять/редактировать в разделе настроек Preferences/Settings | Tools | SSH Configuration, а затем использовать их многократно там, где они нужны.

Изменился путь к конфигам IDE
Например, на macOS:
- ~/Library/Preferences/PhpStorm2019.3
+ ~/Library/Application Support/JetBrains/PhpStorm2020.1
Подробнее в хелпе.
Кастомный путь для сохранения Run-конфигураций
Раньше Run-конфигурации хранились в папке
.idea
, которую многие полностью добавляют в .gitignore (лучше вот так). Теперь можно выбрать любой путь и расшарить Run-конфигурацию с коллегами через систему контроля версий.Может быть особенно удобно при онбординге новых сотрудников: стянул проект, открыл в PhpStorm, запустил одной кнопкой.
Чтобы сделать это, в диалоге Run/Debug-конфигурации нужно отметить опцию Store as project file, а по нажатии шестеренки можно выбрать желаемый путь в проекте.

Контроль версий
Новый Commit
Окно Commit доступно в немодальном режиме и отображается слева. Таким образом оно не блокирует работу над другими файлами во время подготовки коммита, а на экране помещается больше информации об изменениях.
Новый Commit включен по умолчанию для новых пользователей и выключен для тех, у кого уже был установлен PhpStorm.
Включается опцией Use non-modal commit interface в Preferences / Settings | Version Control | Commit.

Улучшения для работы с ветками Git
В нижнем правом углу окна IDE указана текущая ветка Git. Если нажать на нее, то откроется окно VCS | Git | Branches.
Здесь добавили поле для поиска. Кнопка Refresh обновляет список remote-веток. И для каждого коммита добавлен индикатор: входящий (синий) или исходящий (зеленый).

Переработан интерактивный Rebase
Git Rebase позволяет переписать историю коммитов. Теперь можно быстро избавиться от «временных» коммитов, поправить сообщение или порядок коммитов. Конечно, всё это можно сделать и из консоли вручную, но PhpStorm позволяет тут же смотреть, что было изменено в том или ином коммите.
Чтобы начать, в истории коммитов нужно выбрать желаемый базовый коммит и из контекстного меню выбрать Interactively rebase from here.

Инструменты БД
PhpStorm включает в себя почти все возможности DataGrip «из коробки», так что можно посмотреть обзор релиза DataGrip 2020.1 от наших коллег.
Веб
И, как всегда, все обновления из WebStorm 2020.1 тоже входят в PhpStorm.
Полный список изменений можно найти в очень больших release notes.
Обзор релиза можно также посмотреть на странице “What’s new” и если у вас всего несколько минут, то вот короткий ролик (на английском) с демонстрацией главных фич релиза:
А на этом всё на этот раз. Спасибо, что дочитали до конца! Будем рады вопросам, пожеланиям, баг-репортам и просто мыслям в комментариях.
Берегите себя!
Ваша команда JetBrains PhpStorm