Продуктивное использование PHPStorm

:

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

Не претендуя на библию или «настольную статью программиста» я хочу поделиться полезными находками в моей любимой IDE, не скатываясь в тупую копипасту мануалов и скучных списков хоткеев, только то, что я сам использую постоянно и над чем удивляются коллеги: «о! а так можно?»

Disclaimer

Если ни одна из фишек описанных в статье вам была не в новинку, потрудитесь добавить хотя бы одну свою, тогда мир станет лучше, деревья зеленее… ну вы поняли.

Я работаю на Mac, поэтому хот-кеи указываю в «своей» раскладке. Большинство из них будут работать простой заменой [CMD] на [CTRL] или [ALT], остальные, возможно, придется поискать на вкладке Keymap. Буду благодарен, если кто-то проверит и продублирует раскладку для WIN.

Автогенерация кода


Существует куча рутинных задач, которые иногда выполняются самим фреймворком, а иногда требуют тупой ручной работы. PHPStorm помогает упростить некоторые [CTRL]+N, например:

Создание геттеров и сеттеров (Getters & Setters)
По существующим переменным класса можно сгенерировать набор геттеров и\или сеттеров, причем в появляющемся окне можно выбрать для каких именно.

Создание PHPDoc
По сути действие аналогично тому, как если перед существующим методом начать писать /** и нажать Enter. Можно выбрать одну или несколько функций и на основании атрибутов и содержимого будет сформирован Doc Block.

Переназначение и реализация при наследовании (Override & Implementation)
При создании класса потомка или реализации абстрактных методов, чтобы не допустить ошибку, обычно приходится лезть в класс предок и запоминать или копипастить название и атрибуты метода. Или проверять для всех ли абстрактных методов есть реализация и вспоминать что же там требуется для ArrayAccess. Есть вариант получше:
[CMD] + I – Имплементация
[CMD] + O – Переназначение
После нажатия хоткея появляется окно где можно выбрать какие именно методы будем реализовывать. После выбора генерится соответствующий метод с соблюдением приватности и имена атрибутов, например так:

public function createTable($drop = false)
{
    return parent::createTable($drop);
}

Автоформатирование кода


Когда пишешь код сам, обычно форматирование получается само, но в ситуации, когда нужно поменять Code Style или пытаешься открыть чужой непривычно оформленный код, возникают проблемы. Можно смириться, а можно нажать [CMD] + [ALT] + L и IDE отформатирует код в соответствии с настройками (Preferences -> Project Settings -> Code Style -> PHP)

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

Для каждого языка можно задать свой стиль оформления, причем для PHP также можно выбрать один из предзаданных стилей:

  • PEAR
  • Zend
  • Symfony
  • Drupal
  • PSR1\PSR2

Подсказки (Code Completition)


Важной функцией IDE является способность подсказывать названия и атрибуты методов. Особенно это важно для ООП, когда цепочки по 3-4 наследующихся класса способны запутать кого угодно.

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

  • Функция может вернуть несколько типов
  • Объект является элементом массива
    $var = $arr[‘object’];
  • Класс 'B’ extends ‘A’. В классе 'A’ метод foo() возвращает $this, в классе 'B’ реализация метода отсутствует. Вызвав из объекта ‘B’ метод foo() IDE будет думать что возвращен был объект A.
  • При нативной шаблонизации средствами PHP. Где-то в дебрях системы в шаблон передается переменная $some, но внутри шаблона об этом неизвестно.

Варианты решения:

Для функций нужно писать PHPDoc с параметром @ return. Например:

/** @return SomeClass */
function a() {[…]}

Для переменных также можно указать комментарий:

/** @var $my_var SomeClass */

Тогда ниже для $my_var будет доступны подсказки

Для методов над классом можно указать PHPDoc

/** @method B foo() Описание метода */
class B extends A {[…]}

Если функция возвращает массив объектов

/** @return SomeObject[] */

Тогда, например, в foreach становятся доступны подсказки $value->… (по полям и методам класса SomeClass). Спасибо pro100tak

Задачи (tasks)


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

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

Другой положительный момент, что IDE предупреждает, если вы в рамках одной задачи начинаете править файл, уже затронутый в другой.

Добавляет удобства, что при коммите в него автоматически попадают все файлы из текущего change-листа + в комментарий подставляется название задачи.

Хорошо если у вас уже есть багтрекер типа Jira или Redmine, если нет, на том же GitHub есть довольно простая система баг-трекинга, также поддерживаемая PHPStorm. Это позволяет подгрузить номер, название и описание уже существующей задачи по которой вы работаете прямо в IDE, хотя ничто не мешает не пользуясь трекером создавать произвольные change-листы.

FTP, деплой и автодеплой


Со многими проектами работа ведется по FTP или SFTP. PHPStorm имеет удобный функционал для работы с ними. Сохранив доступы к серверу и настроив mapping появляется возможность выгружать и загружать (upload & download) файлы на сервер нажатием одного хоткея. Чтобы работало — нужно не забыть тыкнуть «use this server as default»

Почему-то для Mac не заданы хоткеи по умолчанию для этих действий, но в Keymap можно их задать (спасибо Кэп). Я поставил следующие:
• Upload to Default Server: [CTRL] + U
• Download from Default Server: [CTRL] + D
(привел их для удобства поиска в Keymap + на мой взгляд легко запоминается)

Но об этом всём не стоило бы и писать, если бы не функция автодеплой. Поставив в настройках (Preferences -> Project Settings -> Deployment -> Options) пункт “Upload changed files automatically to default server” в любой режим кроме Never + галочку Upload external changes мы получаем автоматическую синхронизацию всех изменений.

Тут сказывается удобство того, что PHPStorm при нажатии [CMD] + S сохраняет сразу все файлы, т.к в результате процедура сохранения и аплоада совмещаются в одну.

Теперь можно не заботится всё ли загружено и ничего ли не забыто.

Консоль


Многие фреймворки используют консоль для быстрого выполнения частых действий. Для Symfony, Zend и других популярных фреймворков PHPStorm поддерживает подсказки и автодополнение консольных команд в Command Line Tools Console [CMD] + [SHIFT] + X

Но ничто не мешает сделать такое же и для своего проекта или частоупотребляемых команд UNIX или GIT, для этого нужно выбрать исполняемый файл и создать специальный XML файл вида:

<?xml version="1.0" encoding="UTF-8"?>
<framework xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schemas/frameworkDescriptionVersion1.1.2.xsd" name="My Tools" invoke="/full/path/to/console.php" alias="c" enabled="true" version="2">
    <command>
        <name>command-name</name>
        <help>Описание команды. Не забываем про обработку спецсимволов!</help>
        <params>class</params>
    </command>
    <command>
        <name>another:command</name>
        <help>Описание команды с необязательным параметром</help>
        <params>class[=null]</params>
    </command>
</framework>

Подробное описание как это делается вот тут: devnet.jetbrains.net/docs/DOC-1230

Разновидности поиска


[CMD] + N – Find by Class Name

Поиск по имени класса. Удобно в больших проектах, когда всё зарыто вглубь директорий или просто неизвестно где находится. Убойности добавляет «умный поиск», т.к. ищется как по части названия класса, так и по первым буквам, например SomeVeryLongClass будет найден по «SVLC». Учитывает регистр букв, будьте внимательны.

UPD: «Умный поиск» разработчики называют Camel's Hump. Кстати в настройках можно сделать чтобы выделение слов, а также перемещение осуществлялось не целиком (до пробела), а именно по по словам (до заглавной буквы). Спасибо, yujin1st

[CMD] + [SHIFT] + N – Find by File Name

Поиск по имени файла. Аналогично поиску по имени класса использует «умный поиск».

UPD: Для нахождения файла по вложенности можно использовать слеш: some/deep/dir/with/file.txt найдется по «s/d/d/w/f», спасибо develop7

[CMD] + [SHIFT] + [ALT] + N – Find Symbol

Поиск любой функции/метода и констант, очень удобно, когда точно помнишь имя метода, а класс нет. Спасибо conf

[ALT] + [F7] – Find Usages

В момент когда курсор находится на имени класса или метода нажатие хоткея позволяет найти все использования в проекте или определенной части (Scope).

Есть вариант [CTRL] + [ALT] + [F7] — тот же поиск по использованиям, но в виде контекстного меню. Спасибо iPavel

[CTRL] + [SHIFT] + F – Find in Path

Поиск произвольной фразы по файлам проекта. При рефакторинге обычно хорошо дополняет Find Usages.

Не стоило бы писать о “просто поиске”, если бы не возможность ограничить директорию в котором будут искаться нужные штуки, или настроить Scope. Scope позволяет гибко настроить и сохранить область поиска, для использования в дальнейшем. Можно выкинуть из поиска, например, файлы фреймворка или сторонние либы.

Убрать рамку с подписями вкладок


В нижнем левом углу есть кнопка, позволяющая убрать рамки для боковых и нижних вкладок. Сами вкладки можно открывать по сочетаниям [CMD] + 0-9, но некоторые вкладки не имеют цифры. В таком случае поможет быстрое двойное нажатие (даблклик) [CMD], которое на время удержания показывает рамку с кнопками, в которые можно тыкать мышой.

Productivity Guide

В меню Help->Productivity Guide есть возможность посмотреть небольшую статистику про себя, а также список фич со статистикой их использования. Спасибо nxn

Сравнение двух файлов

При выделении двух произвольных файлов в менеджере файлов появляется пункт «Compare Two Files», который показывает их в встроенном дифф-вьювере и позволяет переносить изменения из одного файла в другой. Спасибо pro100tak

Метки в проекте


С помощью [CTRL] + [SHIFT] + 0...9 можно оставлять метки. Вернуться на метку можно с помощью [CTRL] + 0...9. Работает в контексте всего проекта. Спасибо ualinker

Интересные хоткеи из комментариев

[CMD] + [ALT] + T (WIN: CTRL + ALT + T)
Окружение выделения предзаданными штуками, типа тегов или if-else, в зависимости от контекста. Спасибо happyproff

[CMD] + [F12] (WIN: CTRL + F12)
Структура текущего класса с поиском и опциональным отображением унаследованных членов
Аналог вкладки Structure, только во всплывающем окне. Спасибо happyproff

[ALT] + [Home] — быстрая навигация по пути к файлам. Спасибо develop7

[CMD] + [SHIFT] + A — поиск по командам IDE

Alt + ~ — менюшка с git коммандами. Спасибо denver

Ссылки


Презентация на аналогичную тему, спасибо Aivean

Про рефакторинг в PHP Storm, Спасибо fTR