Phpstorm не видит переменные из других файлов

Обновлено: 06.07.2024

Давайте я тоже поддержу межблоговые дискуссии и отвечу Илье. А ответить есть что.

Уже лет 5 я использую PhpStorm как один из основных инструментов. Как такое могло произойти, если среды разработки — уродские и тормознутые? Давайте разбираться.

Переход на PhpStorm

Раньше я программировал в Notepad++. Вершина его функций — поиск и замена по всем файлам в папке. Казалось, этого вполне достаточно. Мне тоже нравилась скорость работы редактора, и я тоже относился к IDE снисходительно. «Я и так знаю названия функций, нахрена мне тормознутая подсветка синтаксических ошибок в коде?»

Я не помню, что заставило меня скачать PhpStorm. Мне могли понадобиться возможности, которых не было в плагинах к Notepad++. Или я заинтересовался, что же находят в нем люди. Помню только, что он подсвечивал желтым слишком много подозрительных мест в моем коде.

Тем не менее, PhpStorm у меня прижился. Как автор опенсорсного продукта — движка S2 — я получил бесплатную лицензию. С тех пор PhpStorm стал одним из основных моих инструментов.

Миф №1: PhpStorm тормозит

PhpStorm как IDE отличается от текстовых редакторов:

  • индексирует файлы проекта, чтобы потом мгновенно искать по ним, не перебирая каждый раз содержимое;
  • распознает контекст: понимает, где названия функций, где локальные переменные, где пути к файлам и т. д.

PhpStorm как редактор не хуже Notepad++. С той же скоростью появляются буквы и перемещается курсор. Поиск работает мгновенно за счет индексации. Анализ кода работает в фоне и может отставать от курсора. Но в этом большой проблемы нет, потому что сначала программист пишет код, а потом смотрит на подсказки среды разработки.

Миф №2: переименование файла занимает в PhpStorm несколько секунд с прогресс-баром

Зависит от того, что нужно программисту. PhpStorm способен искать вхождения старого названия файла по всему проекту и по контексту определять, нужно ли это название изменить. Альтернатива в обычных редакторах — поиск и замена по всем файлам — занимает несколько минут рутинной работы. Экономия времени на два порядка.

Поиск старого названия файла можно отключить прямо в окне переименования. Тогда файл переименовывается мгновенно.


Миф №3: PhpStorm «устанавливать и настраивать год»

Установка проходит не сложнее установки любых других программ. Первоначальной настройки PhpStorm не требует. Может открыть любую папку как проект без предварительных вопросов.

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

  • путь к git.exe для работы с гитом;
  • доступ к БД, чтобы делать запросы из среды разработки;
  • доступ на сервер по SSH/FTP для загрузки файлов проекта.

Пошаговая отладка через Xdebug настраивается сложнее самой природы . Но если не хотите пользоваться пошаговой отладкой с просмотром значений переменных по всему стеку вызовов, отлаживайте , никто не запрещает :)

Миф №4: PhpStorm «выглядит как говно»

Вкусовщина, конечно. Нормально он выглядит. Внешний вид работать не мешает. Чтобы не приводить зря громадный скриншот, покажу заодно «git blame»:


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

Ненене. PhpStorm ничего не показывает, потому что не знает что они инициализированы в этом файле или из этого файла есть доступ к объекту. В скрипте где инициализируются классы, он все показывает. Либо я вас не понимаю, либо вы меня не понимаете. Можете привести минимальный код для воспроизведения? Вроде как достаточно будет всего двух файлов

ВВЕДЕНИЕ

Создаем файлы с указанным вами содержимым. В методе template::somefunc() , действительно, на $this->engine-> нет подсказки.

Смотрим на класс template и видим, что engine там не определен. Да, он где-то чем-то и как-то задается, но ведь задавать его могла не только строчка $template->setEngine($template); (у вас здесь опечатка, но она нам только на руку), но и строчка $template->setEngine($engine);

И что тогда должно отображаться в виде подсказки? Методы класса template или методы класса engine ? А если таких строчек будет много и каждая передает свой объект? Или в setEngine будет передаваться что-то неопределенное? Например:

Что тогда должно отображаться в подсказках?

ДОКУМЕНТИРОВАНИЕ КОДА

Классы можно документировать. Классы надо документировать.

Это позволяет не только другим разобраться в вашем коде, но и вам быстро восполнить пробелы, если вы давно не работали с этим кодом.

Кроме того, при правильном документировании различные IDE смогут выдавать вам различные подсказки по вашему коду (+ вы можете автоматически сгенерировать более-менее нормальную документацию по вашему коду).

Например, описав в вашем классе template атрибут engine мы можем указать класс, объект которого будет храниться в данном атрибуте (или какой-то интерфейс, реализуемый объектом). Т.е. исправив ваш класс следующим образом:

в методе somefunc мы уже будем получать подсказки по доступным методам engine .

При этом даже если мы передадим туда объект класса template (как в вашем примере), IDE все равно будет показывать нам методы класса engine

Единственное, у меня че-то не получилось отобразить в подсказках описание метода и используемых переменных (возможно в PhpStorm это не предусмотрено), но тип возвращаемого значения (и тип переданных параметров) метода показан тот, что был указан в комментарии

В этом уроке мы проведем полную настройку дебаггера для PHP8 в связке с PhpStorm. Для PHP7 используйте инструкцию по настройке XDebug для PHP7.

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

Собственно, так как многим рекурсия показалась сложной, то я решил сделать урок по отладке кода на PHP 8. В этой статье мы рассмотрим настройку отладки с помощью PHP-расширения Xdebug, а производить отладку мы будем в уже известной нам IDE PHPStorm.

Настройка отладки PHP 8 в OpenServer

Первым делом нужно включить расширение Xdebug в файле конфигурации PHP (php.ini). Для этого идём в меню
OpenServer -> Дополнительно -> Конфигурация -> PHP8.

описание картинки

И раскомментируйте её, убрав ; в начале строки, чтобы получилось вот так:

Затем находим секцию [xdebug]

Здесь нам нужно раскомментировать/изменить значения параметров на следующие:

Конфигурация PHP экстеншена XDebug

После этого сохраните файл (CTRL + S) и перезапустите веб-сервер.

перезапуск OpenServer

На этом настройка веб-сервера для отладки завершена.

Настройка отладки в PHPStorm

Теперь нам нужно настроить отладку в PhpStorm. Первым делом идём в настройки:
File -> Settings

Здесь в левом меню выбираем:
PHP -> Debug

В секции Xdebug задаём следующие настройки:

  • Debug port: 9003
  • Force break at first line when no path mapping specified: выключено
  • Force break at first line when a script is outside the project: выключено

Xdebug в PhpStorm

Теперь в верхнем правом углу PhpStorm находим кнопку Add configuration

Конфигурация для дебага

В появившемся окне жмем на плюсик и выбираем пункт PHP Remote Debug.

PHP Remote debug

В поле Name пишем XDebug.

Ставим галочку напротив пункта "Filter debug connection by IDE key". В поле IDE key пишем "PHPSTORM". Напротив пункта Server нажимаем на три точки. При помощи плюсика добавляем новый сервер. Заполняем поля как на скриншоте ниже:

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

Жмём ОК и выбираем только что добавленный сервер. Должно получиться так:

Конфигурация Xdebug

После чего снова жмём ОК.

Настройка расширения Xdebug helper

Далее заходим в магазин расширений Google Chrome, находим расширение XDebug helper и устанавливаем его.

установка XDebug helper

В правом верхнем углу Google Chrome находим иконку с паззлом, жмем на нее, и напротив XDebug helper жмём на три точки. Выбираем пункт "Параметры".

Настройки плагина xdebug helper

В секции IDE key выбираем PhpStorm и обязательно! жмём кнопку Save.

Жмём на паззл ещё раз, и напротив пункта Xdebug helper жмём кнопку для закрепления плагина на панели.

закрепление плагина

Начинаем отлаживать

Итак, все настройки выполнены и дело осталось за малым – начать пользоваться отладчиком.

Вернёмся снова в IDE, в нашем index.php запишем следующий код:

А затем слева от строки $x *= 2; кликнем по пространству между номером строки и самим кодом – появится красная точка.

Ставим брейкпоинт

Это брэйкпоинт (breakpoint), или, как её ещё называют – точка останова. К ней мы вернёмся чуть позже.

В правом верхнем углу PhpStorm напротив выбранной конфигурации XDebug нажимаем на значок зеленого жучка. На нём загорится точка. Внизу IDE появится консоль.

Консоль отладки

Нажмем правой кнопкой мыши на вкладке Console и уберем галочку "Focus on startup".

Выключаем вкладку консоли по умолчанию

И переходим во вкладку Debugger.

Вкладка Debugger

Теперь возвращаемся во вкладку браузера с нашим открытым проектом, жмём на иконку плагина Xdebug helper (жучок), выбираем пункт Debug.

Debug

После чего значок станет зелёным.

Ожидание загрузки страницы

Теперь можно в Chrome обновить страницу, и увидеть, что она повисла в режиме загрузки.

Сработала точка останова в PHPStorm

А в окне PHPStorm увидеть следующее:

Наша программа остановила своё выполнение в месте брэйкпоинта.

Внизу программы (во вкладке Variables) мы можем видеть значения всех переменных в данный момент. Как видим, сейчас (до выполнения строки 5) $x равна 7.

Переход на следующий шаг

Давайте нажмём кнопку “F8”. Она осуществляет выполнение кода на текущей строке и останавливается перед следующим действием.

Умножили $x на 2, и как видим, её значение стало равно 14. Вот так с помощью отладки мы можем отслеживать значения переменных в какой-то определенный момент работы программы.

Помимо этого, есть, разумеется, и другие сочетания клавиш, которые используются во время отладки.

Давайте прямо сейчас нажмём F9. Это приведет к тому, что программа продолжит выполнение до следующего брэйкпоинта (да, их можно наставить сколько угодно). Если их больше не встретится (как в нашем примере), то программа просто завершит свою работу.

Давайте поиграемся с кодом посложнее:

Два брэйкпоинта

И установим два брэйкпоинта на строках 5 и 10.

Попали в первый брэйкпоинт

После чего обновим нашу страничку в браузере и попадём в первый брэйкпоинт на строке 10:

Попали на следующий брэйкпоинт

Здесь мы видим значения переменных $x и $y внутри функции. Нажмём F9 и программа выполнится до того момента, пока не дойдёт до следующего брэйкпоинта.

Здесь мы уже видим, что внутри функции доступны переменные $x и $y. Но это уже другие переменные, не те, что были переданы в функцию getSumOfCos(). Вот мы и увидели локальную область видимости в действии.

Стек вызовов

Помимо этого, в левом нижнем углу есть окошечко “Frames”, это так назваемый “стек вызовов”. Здесь мы можем переключаться на места, откуда был вызван наш код ранее. Так мы можем переключиться в то место, где была вызвана функция getSum().

И можем посмотреть переменные, которые были доступны в той области видимости (уровнем выше).

Watches при отладке

Ещё в правом нижнем углу можно увидеть окошечко “Watches”. Это такое место, где можно задать переменные или даже выражения, значения для которых вы хотели бы видеть всегда под рукой. Добавляются они туда с помощью плюсика. В появившемся окошечке вводим выражение, которое мы бы хотели отслеживать. Пусть это будет $x/2.

Отлично, осталось рассмотреть ещё одну клавишу и вы готовы к бою – F7. Она позволяет зайти “внутрь” какой-либо конструкции.

Один брэйкпоинт

Давайте закончим отладку нажатием F9. Поставим теперь только один брэйкпоинт на строке номер 15 и обновим страничку в браузере.

Если сейчас нажать F8, то программа закончит своё выполнение, и мы не попадём внутрь функций. Так происходит потому что во время отладки мы работаем на определённых уровнях вложенности, и если нам нужно будет попасть внутрь функции, то нужно будет нажать F7, находясь на строке 15. После этого мы окажемся на строке 10. Если сейчас нажать F8, попадём на строку 11. Ещё раз – на строку 12. Если мы сейчас, находясь на 12 строке нажмем F7, то попадём внутрь функции getSum() на строку 5. А если бы мы нажали F8, то мы просто поднялись бы на уровень выше, в то место, где была вызвана функция getSumOfCos().

В принципе, большего для отладки вам не потребуется (лично мне этого хватает).

Ну а сейчас пришла пора поотлаживать рекурсивные функции. Коль уж у вас возникли проблемы с прошлой домашкой – давайте их решать =)

Давайте возьмем и поковыряем код из предыдущей домашки:

Отладка рекурсивной функции

Поставим брэйкпоинт на 3 строке и запустим программу.

Уровень вложенности возрос

Итак, в функцию попала переменная $x = 3. Нажимаем F8, и попадаем на строку 7, так как условие не выполнилось. Теперь нажмём F7 и снова попадём в начало нашей функции, но теперь $x = 2. И при этом стек вызовов увеличился ещё на одну строку, то есть мы вошли в ещё один уровень вложенности.

И ещё один уровень вложенности

Жмём F8 и снова оказываемся на строке 7. Нажимаем F7 и снова попадаем в новый вызов функции, только уже $x = 1, а в стэке вызовов появился ещё один уровень.

Пошёл вывод

Снова F8 и затем F7. И вот уже в функции $x = 0.
Жмём F8 и оказываемся на строке 4 (теперь условие выполнилось). На этой строке программа выведет 0.

Жмём F8 и попадаем на строку 5. Сейчас функция завершит свою работу и мы попадём на уровень выше, в то место, где она была вызвана. Итак, жмём F8.

Вернулись на уровень выше

Вуаля, мы вернулись на уровень выше, там, где переменная $x = 1.

И попали мы на следующую строку, после той в которой вызвали функцию numbers(1 - 1). И на этой строке мы вывели уже число 1. А дальше – жмите F8 и наблюдайте за ходом выполнения программы. Надеюсь теперь рекурсия для вас понятна =)

Настройка синхронизации файлов сервера с локальными через PHPStorm

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

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

Содержание

Создание нового соединения с удаленным сервером

Настройки синхронизации файлов сервера с локальными

phpstorm_deployment_options.jpg

Теперь настроим опции в каких случаях необходимо синхронизировать файлы с сервером. Для этого необходимо перейти на вкладку Tools → Deployment → Options через главное меню и в появившемся окне выставить необходимые параметры

Параметров довольно много, но наибольший интерес представляют следующие опции:

  • Upload changed files automatically to the default server - автоматическая загрузка измененных файлов на сервер с возможными вариантами (загружать всегда, по горячей клавише Ctrl + S, либо не загружать вовсе).
  • Upload external changes означает, что будут закачиваться файлы (папки) не только те, над которыми вы непосредственно ведете работу, но и те, которые, например, были добавлены раньше (и в данный момент на сервере отсутствуют).
  • Warn when uploading over newer file - предупреждать при загрузке более нового файла. В зависимости от выбранного параметра из выпадающего списка, PHPStorm будет выполнять (предлагать) варианты разрешения конфликта. Возможные параметры:
    1. No - выберите эту опцию, если необходимо, чтобы локальные изменения текущего файла всегда перезаписывали файл на удаленном сервере, вне зависимости от того был он до этого изменен или нет.
    2. Compare timestamp and size - в этом случае PHPStorm будет выполнять проверку размера локального и удаленного файлов, а также время текущей модификации удаленного файла со временем последней синхронизацией на сервере. Если есть изменения, то появится окно с вариантами: смержить результат, проигнорировать либо переписать.
    3. Compare content - сравнение содержимого локального и удаленного файлов на наличие изменений. Если таковые имеются, как и во втором варианте, будет предложены пути разрешения конфликта.
  • Notify about remote changes означает, что редактор будет показывать напоминание о том, что имеются различия в файлах. Данная опция доступна если предыдущая настройка была выставлена в Compare timestamp and size, либо в Compare content.

Можно также синхронизироваться вручную, вызвав контекстное меню по нужному файлу (папке) и выбрав пункт Deployment → Sync with Deployed to . . Опции Upload to . и Download from. отвечают за закачку на сервер и скачку с удаленного сервера соответственно.

Для комфротной разработки нам нужно хорошее окружение. Лично я использую локальный веб-сервер Nginx + Php5-fpm + Mysql на MacOS X, но это далеко не обычная конфигурация.

Гораздо проще и доступнее использовать любой хостинг с доступом к сайту по SFTP. Неважно, какой именно: shared, vps или cloud.

Конкретно для нашей задачи, чтобы сделать рабочее окружение максимально одинаковым и доступным для всех участников обучения, мы будем использовать бесплатный аккаунт на MODXCloud и 30 дневную пробную версию IDE PhpStorm.

Тут все проще некуда. Регистрируемся, заходим, создаём облако.




После входа жмём Clouds в верхнем меню, потом Add new cloud, заполняем требуемые поля, выбираем тарифный план Development и нажимаем Complete Cloud Creation.




Дальше ждем минут 5, пока новое облако будет готово. Вы увидите новое уведомление вверху экрана и облако появится в списке. Заходим в него, и в самом низу видим доступ по SFTP — он то нам и нужен.




Вот и вся настройка хостинга. Данные для входа на сайт лежат у вас в ящике с уведомлениями:


Настройка PhpStorm¶

Cкачиваем и устанавливаем PhpStorm. Скорее всего, вам потребуется загрузить еще и Java 7, он сам должен об этом сказать.

Мы получаем пробную версию без ограничения функциональности, на 30 дней. Этого вполне достаточно, чтобы пройти весь курс и определиться, нужно ли покупать эту прекрасную IDE, или стоит поискать бесплатные аналоги. Лично я купил её на прошлой новогодней распродаже, кажется, за $25. Надеюсь, и в этом году нас всех порадуют — ибо нужно продлять лицензию =)

Запускаем IDE, создаём новый проект Sendex.




Лично я переношу все панельки вправо, потому что я правша и там мне к ним удобнее лазить. Сделать это очень просто — через контекстное меню.

Для оформления я использую тему Twilight со шрифтами Ubuntu Mono, почти все настройки по умолчанию. Стиль оформления кода стандартный, с одним изменением — настоящая, а не smart, табуляция. Древний холивар «табы vs пробелы» я решил для себя просто — табы.




Если кому интересно — вот экспорт моих настроек, можно импортировать себе.

Дальше мы настраиваем связь с сервером. Это один из самых важных моментов в дальнейшей работе. Выбираем в меню: Tools → Deployment → Configuration, добавляем новый сервер и вбиваем данные от MODXCloud:




Не забываем ответить зелёную галочку в левом-верхнем углу окошка, чтобы наш новый сервер стал по-умолчанию для этого проекта. Также после настройки желательно нажать Apply и Test SFTP connection.


Если видим слово successfully, значит все хорошо.

С этого момента мы уже можем спокойно работать с файлами и директориями на сервере. Для этого нужно найти вкладку Remote host справа и кликнуть. В директории www лежит наш сайт, в котором можно создать директорию Sendex.


Теперь второй важный момент — нам нужно настроить синхронизацию между удалённой директорией Sendex и локальным проектом. Это делается там же, в настройках Deployment, вкладка Mapping:


Создаём в проекте файл test.php и копируем туда код для проверки:




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


Как видите, мы уже работаем с ядром MODX из этого файла, который находится у нас в проекте и синхронизируется с удалённой директорией.

Одна загвоздка — в редакторе всё как-то некрасиво выглядит и ругается на undefined variable 'modx':


Это оттого, что PhpStorm не знает MODX из коробки, и нам нужно подключить его в проект. Тогда IDE проиндексирует файлы и научится понимать объявленные переменные и их методы.

Нужно скачать последнюю версию MODX Revolution с официального сайта, распаковать куда-то на вашем компьютере и подключить в проект через контекстное меню External Libraries в окошке файлов проекта:




Нажимаем сохранить и все ошибки, кроме невозможности открыть файл index.php, пропадают. Этого файла у нас в проекте нет — он лежит на сервере, так что просто игнорируем.

Обратите внимание, что после подключения MODX в проект, мы видим все его методы при наборе — волшебный PhpStorm начинает нам их подсказывать.


Более того, по методам и переменным можно переходить, просто нажав на них Ctrl+B.

Заключение¶

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

На следующем занятии мы склонируем modExtra из репозитория и разберем его структуру.

Читайте также: