В этом релизе мы полностью поддержали PHP 8.1, улучшили обработку дженериков, реализовали drag-and-drop для перемещения классов и пространств имен, обновили HTTP-клиент, повысили удобство процесса развертывания и управления версиями, а также добавили новые возможности удаленной разработки.
Под катом подробный разбор всех изменений и новых возможностей с кучей гифок.
Скачать PhpStorm можно на сайте или через приложение Toolbox App.
Как и раньше, студентам, преподавателям и тем, кто занимается опенсорс-проектами, JetBrains предоставляет бесплатные лицензии. Стартапам доступна скидка 50%.
Итак, вот что мы подготовили для вас в этом обновлении:
Полная поддержка PHP 8.1
- Перечисления
- Readonly-свойства
- Пересечения типов
- Новое (не)возвращаемое значение: `never`
- Финальные константы
- Оператор `new` в инициализаторах
- Синтаксис First-class callable
- Устаревшие возможности
Дженерики в PHP
- Улучшенная поддержка Doctrine Collections
- Поддержка коллекций Laravel 9
- Вывод дженерик-типа из конструктора
- Поддержка аннотаций phpstan-*
Улучшения рефакторингов
Удаленная разработка
Более быстрый и улучшенный деплоймент
- Поддержка `rsync`
- Повторная попытка для неудачных загрузок
- Ускорение для SFTP/FTP/FTPS благодаря многопоточным соединениям
- Новое действие: Загрузить все открытые файлы
- Быстрое переключение сервера по умолчанию для проекта
- Поддержка proxу для SSH соединений
HTTP клиент
- Поддержка текстовых и JSON стримов
- Бинарные ответы
- Перенаправление вывода в файл или каталог
- Поддержка идентификаторов HTTP-запросов
VCS
- Выравнивание изменений при просмотре диффа
- Checkout and Rebase onto Current для удаленных веток
- Реорганизованные настройки VCS
- Новое действие ‘Push All up to Here’
Обновления UX
PHP 8.1
PHP 8.1 уже вышел! Подробнее об обновлениях языка можно узнать из видеоролика, который мы подготовили совместно с Brent Roose и авторами разных RFC: Larry Garfield, Matheu Napoli, Aaron Pietrowski, Дмитрий Стогов, Никита Попов.
PhpStorm 2021.3 полностью поддерживает изменения, введенные PHP 8.1. Подробнее об этом рассказываем ниже.
Как обычно, чтобы попробовать новые возможности, необходимо установить PHP 8.1 в качестве PHP language level. Настройка доступна в панели инструментов. Либо вы можете прописать соответствующее требование в
composer.json
.Перечисления
Вместо набора констант теперь можно использовать перечисления (enum). Они обеспечат проверку типов из коробки.
Поддержка перечислений появилась в PhpStorm еще в релизе 2021.2. Подробнее об этом читайте в предыдущем хабрапосте.
Readonly-свойства
Свойства с флагом readonly — это свойства, которые нельзя изменить после инициализации (то есть после присвоения им значения).
В предыдущих версиях PHP можно было добиться похожего поведения с помощью приватных сеттеров. Однако ключевое слово
readonly
позволяет сделать класс более читаемым, а ограничение — более строгим.Свойство
readonly
может быть инициализировано только в той же области видимости, в которой оно объявлено, то есть в самом объявлении либо в методе класса.Свойства с флагом
readonly
должны быть типизированы, но если вы не знаете тип заранее, можно использовать mixed
.Если вы проинициализировали свойство
readonly
объектом, то этот объект (его внутреннее состояние) останется изменяемым.У свойства
readonly
не может быть значения по умолчанию. Однако такое свойство можно инициализировать в конструкторе: нажмите Alt+Enter, чтобы применить соответствующее быстрое исправление:Пересечения типов
В PHP 8.0 были добавлены объединения типов (union). А теперь в PHP 8.1 появились пересечения (intersection).
Синтаксис типов intersection такой:
TypeA&TypeB
. То есть значение должно одновременно являться instanceof TypeA
и instanceof TypeB
.В PhpStorm 2021.3 автодополнение типов union и intersection устроено одинаково, ведь их различие только в том, что union может содержать члены всех указанных типов, а intersection должен содержать члены этих типов.
Комбинации с типами union PHP пока не поддерживает. Поэтому такое выражение будет считаться ошибкой:
В более старых версиях PHP можно было встретить пересечения типов в аннотациях PHPDoc. Они тоже поддерживаются в PhpStorm 2021.3. Когда вы решите перейти на PHP 8.1, то сможете легко трансформировать аннотации PHPDoc в нативные определения с помощью Alt+Enter:
Новый тип never
В PHP 8.1 появился новый тип для (не)возвращаемых значений —
never
.Tип
never
означает, что функция (или метод) не возвращает ничего и либо генерирует исключение, либо завершает выполнение вызовом die()
, exit()
, trigger_error()
и т. п.Тип
never
улучшает анализ кода. Он делает практически то же самое, что и атрибут PhpStorm #[NoReturn]
, — отличие в том, что теперь это полноценная часть языка!Финальные константы
PHP 8.1 позволяет объявлять константы класса как финальные, после чего их нельзя переопределить в дочерних классах.
В PHP 8.0 и более ранних версиях языка константы в интерфейсах были неявно финальными, и их нельзя было изменить. В PHP 8.1 эту неконсистентность убрали: теперь константы по умолчанию — не финальные.
Оператор new
в инициализаторах
В PHP 8.1 для параметров, статических переменных, глобальных констант и аргументов атрибутов можно указывать значения по умолчанию.
У этого есть приятный побочный эффект — появляется возможность использовать вложенные атрибуты.
PhpStorm проверяет, где именно вы используете оператор
new
. Например, использовать его со свойствами или константами класса нельзя, так как при этом возникают проблемы с порядком инициализации:Синтаксис First-class callable
В PHP 8.1 появилась возможность получить ссылку на любую функцию.
Раньше это нужно было делать вот так:
$fn = Closure::fromCallable('strlen');
Теперь все гораздо проще:
$fn = strlen(...);
Новый синтаксис соблюдает область видимости в точке создания вызываемого объекта, а также поддается статическому анализу и выглядит более лаконично.
Вызовы
fromCallable
можно преобразовать к новому синтаксису. Для этого нажмите Alt+Enter и выберите нужное быстрое исправление:Устаревшие возможности
PHP порой удивлял своим причудливым поведением. Но с каждой новой версией языка проблем в нем становится все меньше. И PHP 8.1 не исключение: многие проблемные места объявлены устаревшими.
Чтобы перевести проект на PHP 8.1, прежде всего нужно поправить совместимость и свериться со списком устаревших возможностей.
PhpStorm поможет найти устаревший код и обновить его.
Вот пара примеров устаревших возможностей.
Использование интерфейса Serializable
Вместо интерфейса
Serializable
рекомендуется использовать магические методы __serialize()
и __unserialize()
, появившиеся в PHP 7.4.В PHP 8.1 разрешает использовать
Serializable
, но только в тех случаях, когда реализующий его класс содержит __serialize()
и __unserialize()
.PhpStorm выделит неправильный код и предложит добавить магические методы в класс при помощи быстрого исправления:
Использование $GLOBALS
Некоторые варианты использование суперглобальной переменной
$GLOBALS
требовали специальный обработки в интерпретаторе, что влияло на производительность всех массивов. Поэтому были ограничены попытки изменить саму переменную, а вот чтение и запись в нее остались как раньше.Подробнее об устаревших возможностях PHP можно узнать в руководстве по обновлению.
Улучшения для дженериков
В PhpStorm 2021.2 появилась долгожданная базовая поддержка дженериков. Мы продолжаем ее совершенствовать. Спасибо за ваши отзывы и тикеты в трекере!
Вот что нам удалось сделать в этом релизе:
Улучшение поддержки Doctrine Collections
Аннотация
@template
теперь поддерживает интерфейс IteratorAggregate
. Таким образом, итерация по коллекциями Doctrine теперь работает из коробки!Поддержка коллекций Laravel 9
В ближайшем выпуске Laravel, пакет illuminate/collections будет покрыт аннотациями дженериков. В PhpStorm 2021.3 для них автоматически заработает автодополнение кода.
Вывод дженерик-типов из конструктора
Допустим, в конструкторе есть дженерик-параметр
@template
, и вы хотите уточнить тип, передав объект в качестве аргумента. Это не сработало бы в предыдущих версиях. В версии 2021.3 это работает правильно. Также вы сможете воспользоваться автодополнением.Поддержка аннотаций phpstan-*
PhpStorm 2021.3 поддерживает любые аннотации для дженериков. Можно использовать префикс
@psalm-*
или @phpstan-*
, а также чистые теги без префиксов, например @template
.Улучшенные рефакторинги
Перемещение классов и неймспейсов с помощью drag-and-drop ?
Раньше, если вы перемещали файл или папку в дереве файлов проекта, то неймспейсы в классах при этом не изменялись, и приходилось править файлы вручную.
Теперь вы можете перемещать файлы и даже целые папки, используя drag-and-drop. PhpStorm сам обновит неймспейсы в классах и во всех их использованиях!
Рефакторинг Move Class / Move Namespace поможет вам легко реструктурировать проект. Ну а если что-то пойдет не так, то всегда можно отменить рефакторинг, нажав Ctrl-Z.
Чтобы этот рефакторинг работал, необходимо правильно настроить PSR-0 / PSR-4.
Мы переработали рефакторинги Inline method, Inline variable, Extract variable и Extract method. Они стали работать более надежно и предсказуемо. Попробуйте их!
Inline function or method
Когда тело метода более очевидно, чем его название, имеет смысл заменить вызовы метода его содержимым, а сам метод удалить.
Чтобы использовать этот рефакторинг, поместите каретку на вызов метода и нажмите Ctrl+Alt+N (⌥⌘N на macOS).
То же самое с приватными методами, используемыми всего один раз. Вы можете встраивать их при помощи нового быстрого исправления Inline method, доступного также по Alt+Enter:
Inline variable
Порой лишние переменные только загромождают код.
Вы можете заменить ссылку на переменную самим выражением, поместив каретку на переменную и нажав Ctrl+Alt+N (⌘⌥N на macOS).
Если переменная используется только один раз, ее можно заменить при помощи быстрого исправления (Alt+Enter):
Если вы не помните название рефакторинга или сочетание клавиш для его вызова, просто нажмите Ctrl+T (⌃T) и найдите нужный рефакторинг в списке.
Удаленная разработка
PhpStorm 2021.3 поставляется с возможностями удаленной разработки. Они позволят вам писать, запускать и отлаживать код с любой машины.
Теперь вы можете подключаться к удаленному серверу, на котором запущен бэкенд PhpStorm. Вся обработка данных выполняется на мощной удаленной машине. При этом вы можете работать над проектом привычным образом — как будто он размещен локально.
Функция удаленной разработки доступна на начальном экране PhpStorm, а также в новом приложении JetBrains Gateway (чтобы установить его, воспользуйтесь Toolbox App).
Пока что возможности удаленной разработки доступны в бета-версии. Мы продолжаем активно дорабатывать их.
Улучшенные возможности развертывания
PhpStorm позволяет загружать файлы на удаленную машину. В версии 2021.3 мы ускорили этот процесс и добавили несколько долгожданных возможностей.
Все настройки развертывания доступны в Settings/Preferences | Build, Execution, Deployment | Deployment.
Поддержка rsync
При использовании SFTP-сервера для развертывания в разделе Advanced, появится новая опция
rsync
.Использование
rsync
позволяет значительно ускорить развертывание!Вот результаты бенчмарка загрузки Drupal 8 (12 757 файлов, 120 МБ, SFTP на локальном Docker):
rsync выключен: 6.26 минут
rsync включен: 38.192 секунд — в 9 раз быстрее!
Чтобы включить rsync, перейдите в настройки SFTP-сервера и поставьте флажкок `Use rsync for download/upload`:
Путь к исполняемому файлу
rsync
настраивается в разделе Settings/Preferences | Tools | Rsync:Для macOS и Linux он должен быть доступен сразу же. Для Windows мы рекомендуем использовать Cygwin и OpenSSH.
Повторная загрузка файлов
Загрузка файлов на сервер может зафейлиться по разным причинам. В таком случае вы сможете легко повторить загрузку.
Если загрузка сорвется, вы увидите ссылку Retry в окне File Transfer.
Ускорение для SFTP/FTP/FTPS благодаря многопоточным соединениям
Мы подготовили долгожданную реализацию многопоточного развертывания. Поддерживаются операции upload, download и drag-and-drop. Синхронизация и автоматическая загрузка пока не поддерживаются.
Новая опция Number of connections находится в секции Advanced в конфигурации SFTP/FTP/FTPS сервера. Число подключений по умолчанию — 5:
Новое действие Upload all opened files
Если у вас открыто несколько файлов в разных вкладках, то теперь можно загрузить их все одной командой, Upload All Open Files to…. Она доступна в разделе Tools | Deployment, через поиск по командам (Cmd/Ctrl+Shift+A), или из контекстного меню любого файла.
Выбор сервера по умолчанию для проекта
В строке состояния доступен новый виджет, который показывает текущий сервер по умолчанию. Здесь же вы можете выбрать другой сервер.
Поддержка прокси для SSH-соединений
Теперь можно указать прокси-сервер HTTP или SOCKS для SSH-конфигураций в Preferences / Settings | Tools | SSH Configurations.
Также можно синхронизировать настройки SSH-прокси с глобальными настройками IDE. Для этого установите флажок Use global IDE proxy settings.
Улучшения HTTP-клиента
Поддержка текстовых и JSON стримов
Теперь стало проще тестировать потоковые приложения, потому что версия PhpStorm поддерживает следующие типы контента: text/event-stream, application/stream+json и application/x-ndjson. Это означает, что HTTP-клиент больше не будет ждать окончания стрима, а будет отображать сразу вывод на лету.
Бинарные ответы в HTTP-клиенте
Теперь, если HTTP-клиент получает в качестве ответа изображение, он отображает картинку в консоли ответа.
Перенаправление вывода в файл или каталог
HTTP-клиент теперь может перенаправлять вывод в файл или каталог с помощью соответствующих операторов:
>>
(всегда создает новый файл),>>!
(переписывает файл, только если он уже существует).
Поддержка идентификаторов HTTP-запросов
PhpStorm 2021.3 теперь понимает идентификаторы (или имена) для запросов — как объявленные в виде комментария (с
@name
), так и объявленные в виде текста в первом разделителе (###
).Вы сможете вызывать запрос по идентификатору из окна Services, а также из диалоговых окон Run Configuration, Run Anything или Search Everywhere.
VCS
Выравнивание изменений при просмотре Diff
Мы добавили новую опцию Align Changes Highlighting в окне Diff под шестеренкой.
Эта опция выравнивает строки, в которых нет изменений, так, чтобы они отображались рядом друг с другом. Так вы будете лучше видеть код, который был добавлен или удален.
Checkout and Rebase onto Current для удаленных веток
Действие Checkout and Rebase onto Current позволяет сделать чекаут выбранной ветки и перебазировать ее поверх текущей ветки. Раньше это работало только для локальных веток, а теперь возможно и для удаленных.
Реорганизация настроек VCS
Настройки системы контроля версий доступны в Preferences/Settings | Version Control. Мы по-новому структурировали их — теперь вам будет легче находить нужные действия.
Новое действие Push All up to Here
Если вы хотите сделать push части коммитов, а другую часть пока оставить в работе, можете использовать новое действие Push All Up to Here.
Просто перейдите на вкладку Log окна Git, выберите нужный коммит и, щелкнув по нему правой кнопкой мыши, выберите действие Push All up to Here.
UX
Новое окно Bookmarks
Мы объединили сущности Favorites и Bookmarks в одну и создали отдельное окно Bookmarks.
Вы можете добавить закладку для определенной строки, файла или папки, нажав F3 на macOS или F11 на Windows/Linux. Все созданные закладки будут доступны в окне Bookmarks.
Просмотр кода в Show Usages
Диалоговое окно Show Usages, доступное по Ctrl+Click (⌘+Click) теперь показывает превью исходного кода для найденного использования.
Чтобы включить предпросмотр, нажмите кнопку на панели инструментов.
Улучшения для Markdown
Одной из самых муторных проблем при редактировании markdown всегда было добавление и редактирование таблиц. В PhpStorm 2021.3 эта проблема решена.
Теперь достаточно открыть контекстное меню (в любой точке markdown-файла) и выбрать Insert | Table. И это все! Размер исходной таблицы можно выбрать мышкой.
Для создания новой строки таблицы можно использовать Shift+Enter, а для перехода к следующей ячейке — Tab.
Инструменты для работы с БД
PhpStorm включает встроенную функциональность DataGrip. Подробнее обо новых возможностях DataGrip читайте в обзоре релиза DataGrip 2021.3 от наших коллег.
Веб-разработка
И как всегда, в PhpStorm вошли все обновления из WebStorm 2021.3.
А вот видеоролик (на английском), представляющий главные фичи нового релиза:
На этом пока все. Будем рады вашей обратной связи — вопросам, пожеланиям, баг-репортам и просто мыслям. Оставляйте их в комментариях ниже.