Среда разработки VS Code для проектов на PHP

Раздел: Инструменты -> Среды разработки

Visual Studio Code – это лёгкий, но мощный редактор, который после правильной настройки превращается в полноценную среду разработки для PHP. Рассмотрим основной способ организации рабочего процесса и несколько альтернативных вариантов, каждый из которых решает конкретные задачи.

Основные приёмы работы с PHP в VS Code

Как настроить VS Code для PHP с автодополнением и отладкой?

Самый эффективный способ – установить ключевые расширения и сконфигурировать пути к PHP.

Шаг 1. Установка расширений

В боковой панели расширений найдите и установите:

  • PHP IntelliSense (by Damjan Cvetko) – автодополнение, переход к определению, подсветка
  • PHP Debug (by Felix Rieseberg) – отладка через Xdebug
  • phpcs (by Ioannis Kappas) – проверка стиля кода (опционально)
// После установки в settings.json добавляем путь к PHP. Открыть через Ctrl+Shift+P -> Preferences: Open Settings (JSON)

{
  "php.executablePath": "C:\\php\\php.exe", // Windows
  // "php.executablePath": "/usr/local/bin/php", // macOS/Linux
  "php.suggest.basic": false
}

Vs code php (vs code для php)

Шаг 2. Настройка отладчика (Xdebug)

Убедитесь, что Xdebug установлен и активирован. В папке проекта откройте .vscode/launch.json и добавьте конфигурацию для прослушивания запросов:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9000
    },
    {
      "name": "Launch currently open script",
      "type": "php",
      "request": "launch",
      "program": "${file}",
      "cwd": "${fileDirname}",
      "port": 9000
    }
  ]
}

Openserver index php (openserver (среда разработки))

Шаг 3. Проверка

Создайте простой файл index.php с точкой останова (F9) и нажмите F5. При запуске через браузер или терминал отладчик остановится на точке останова.

Возможная проблема: ошибка "PHP executable not found" – проверьте путь в settings.json. На Windows пути могут содержать обратные слэши, их нужно экранировать.

Если отладка не запускается, убедитесь, что Xdebug слушает порт 9000. В новых версиях Xdebug 3 используется порт 9003. Измените port на 9003 и добавьте в php.ini: xdebug.mode=debug.

Как подключить автоматическую проверку стиля кода (PHP_CodeSniffer)?

Для соблюдения PSR-12 или собственных стандартов удобно использовать расширение phpcs вместе с глобальным пакетом PHP_CodeSniffer.

Установка

composer global require squizlabs/php_codesniffer
# и убедитесь, что ~/.composer/vendor/bin добавлен в PATH

В настройках VS Code укажите путь к phpcs:

"phpcs.executablePath": "~/.composer/vendor/bin/phpcs",
"phpcs.standard": "PSR12"

Теперь при каждом сохранении или вводе кода будет появляться подсветка ошибок и предупреждений.

Ошибка: если phpcs не запускается, проверьте, доступен ли он из терминала VS Code. Можно указать полный путь.

Если стандарт не найден, создайте в корне проекта phpcs.xml или используйте абсолютный путь до стандарта.

Как автоматически форматировать код при сохранении с помощью PHP CS Fixer?

PHP CS Fixer не только проверяет, но и исправляет стиль. Установите его и настройте запуск на сохранение.

composer global require friendsofphp/php-cs-fixer

В settings.json добавьте:

"[php]": {
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "bmewburn.vscode-intelephense-client" // если используете Intelephense
}

Но для PHP CS Fixer можно использовать задачу или расширение vscode-php-cs-fixer. После установки расширения укажите путь:

"php-cs-fixer.executablePath": "~/.composer/vendor/bin/php-cs-fixer",
"php-cs-fixer.onsave": true,
"php-cs-fixer.config": ".php-cs-fixer.dist.php"

Проблема: форматирование может конфликтовать с другими расширениями (например, Intelephense). Рекомендуется отключить форматирование в Intelephense и оставить только один инструмент.

Как запускать PHPUnit тесты из VS Code?

Для удобного выполнения тестов установите расширение PHPUnit Test Explorer. Оно обнаруживает тесты и даёт кнопки для запуска.

Убедитесь, что phpunit установлен глобально или локально, и создайте phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php">
  <testsuites>
    <testsuite name="Unit">
      <directory>tests/Unit</directory>
    </testsuite>
  </testsuites>
</phpunit>

В настройках расширения укажите путь:

"phpunit.path": "./vendor/bin/phpunit"

Теперь в боковой панели Test Explorer появятся все тесты.

Ошибка: если тесты не отображаются, проверьте корректность xml-конфига и наличие autoload.php.

Как разрабатывать PHP в изолированном Docker контейнере с поддержкой отладки?

Используйте расширение Remote - Containers, чтобы VS Code подключался к контейнеру и использовал его инструменты.

Пример .devcontainer/devcontainer.json:

{
  "name": "PHP App",
  "dockerComposeFile": "../docker-compose.yml",
  "service": "php",
  "workspaceFolder": "/app",
  "extensions": ["bmewburn.vscode-intelephense-client", "felixfbecker.php-debug"]
}

В Dockerfile установите Xdebug:

FROM php:8.2-cli
RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

В launch.json контейнера настройка выглядит аналогично, но с добавлением pathMappings:

{
  "name": "Listen for Xdebug (Docker)",
  "type": "php",
  "request": "launch",
  "port": 9003,
  "pathMappings": {
    "/app": "${workspaceFolder}"
  }
}

Проблема: xdebug не подключается – проверьте совпадение портов и режим (xdebug.mode=debug). В контейнере может потребоваться установить переменную XDEBUG_CONFIG или флаг xdebug.discover_client_host=true.

Как создать собственные сниппеты для ускорения написания PHP кода?

Сниппеты (фрагменты кода) позволяют быстро вставлять часто используемые конструкции. Создайте файл php.json в папке .vscode или глобально: File -> Preferences -> Configure User Snippets -> php.json.

{
  "PSR-4 class": {
    "prefix": "class",
    "body": [
      "<?",
      "",
      "namespace ${1:App}\\${2:Module};",
      "",
      "class ${3:ClassName}",
      "{",
      "    public function __construct()",
      "    {",
      "        $0",
      "    }",
      "}"
    ],
    "description": "Create a new PHP class with namespace and constructor"
  },
  "PHPUnit test method": {
    "prefix": "test",
    "body": [
      "public function test${1:Feature}(): void",
      "{",
      "    ${2:// given}",
      "    ${3:// when}",
      "    ${4:// then}",
      "}"
    ],
    "description": "PHPUnit test method stub"
  }
}

После сохранения введите class и нажмите Tab – появится шаблон.

Ошибка: сниппет не срабатывает – проверьте синтаксис JSON. Переменные вида $1 не должны иметь пробелов.

Расширенный пример: отладка веб-приложения с Xdebug в том же браузере

Предположим, приложение запускается на http://localhost:8080. Чтобы отладчик срабатывал при каждом запросе, настройте launch.json со следующим содержимым:

Пример
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "xdebug.idekey": "VSCODE"
    },
    {
      "name": "Launch index.php",
      "type": "php",
      "request": "launch",
      "program": "${workspaceRoot}/index.php",
      "cwd": "${workspaceRoot}",
      "port": 9003,
      "xdebug.idekey": "VSCODE"
    }
  ]
}

Убедитесь, что в php.ini вашего веб-сервера заданы:

Пример
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal  # если в контейнере
xdebug.client_port=9003

Запустите отладку (F5), откройте браузер по адресу приложения. Когда код дойдёт до точки останова, VS Code остановится и покажет переменные.

Результат: в консоли отладчика появятся значения переменных, можно пошагово исполнять код.

Пример настройки tasks.json для автоматизации Composer

Создайте в папке .vscode файл tasks.json:

Пример
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "composer update",
      "type": "shell",
      "command": "composer update",
      "group": "build",
      "problemMatcher": []
    },
    {
      "label": "run tests",
      "type": "shell",
      "command": "./vendor/bin/phpunit",
      "group": "test",
      "presentation": {
        "reveal": "always"
      }
    }
  ]
}

Теперь через Ctrl+Shift+B можно запускать composer update, а через панель задач (или сочетание клавиш) – тесты.

Результат выполнения в терминале: появляется вывод composer или phpunit с цветным логом.

Пример конфигурации PHP CS Fixer с кастомными правилами

Создайте файл .php-cs-fixer.php в корне проекта:

Пример
<?php

$finder = PhpCsFixer\Finder::create()
    ->in(__DIR__)
    ->exclude('vendor');

return (new PhpCsFixer\Config())
    ->setRules([
        '@PSR12' => true,
        'array_syntax' => ['syntax' => 'short'],
        'no_unused_imports' => true,
        'ordered_imports' => ['sort_algorithm' => 'alpha'],
    ])
    ->setFinder($finder);

После настройки расширения vscode-php-cs-fixer при сохранении файла он будет автоматически отформатирован: короткий синтаксис массивов, удалены неиспользуемые импорты, импорты отсортированы по алфавиту.

Результат: код приводится к единому стилю.

Пример работы с Docker и remote-контейнером для Laravel

Структура проекта:

Пример
.
├── .devcontainer/
│   ├── devcontainer.json
│   └── Dockerfile
├── docker-compose.yml
└── src/

Dockerfile (минимальный):

Пример
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y git unzip \
    && pecl install xdebug && docker-php-ext-enable xdebug \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY --from=node:18 /usr/local/bin/node /usr/local/bin/node

docker-compose.yml:

Пример
version: '3.8'
services:
  php:
    build: .
    volumes:
      - ./src:/app
    working_dir: /app
    environment:
      - XDEBUG_MODE=debug
      - XDEBUG_SESSION=VSCODE
  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./src:/app
      - ./nginx.conf:/etc/nginx/conf.d/default.conf

После открытия папки в VS Code предложит переоткрыть в контейнере. Внутри контейнера отладка настраивается так же, только в launch.json добавляют pathMappings как в основном разделе.

Результат: полное окружение с PHP, Xdebug, Composer, Nginx, всё изолировано и готово к разработке.

Пример продвинутого сниппета для репозитория-паттерна Repository

Сниппет генерирует полноценный класс репозитория с внедрением зависимости Eloquent модели:

Пример
{
  "Repository": {
    "prefix": "repo",
    "body": [
      "<?php",
      "",
      "namespace App\\${1:Repositories};",
      "",
      "use App\\Models\\${2:Model};",
      "",
      "class ${2:Model}Repository",
      "{",
      "    protected \\${2:Model} \\$model;",
      "",
      "    public function __construct(\\${2:Model} \\$model)",
      "    {",
      "        \$this->model = \$model;",
      "    }",
      "",
      "    public function find(\$id): ?\\${2:Model}",
      "    {",
      "        return \$this->model->find(\$id);",
      "    }",
      "}"
    ],
    "description": "Create a Repository class with dependency injection"
  }
}

При вводе repo и Tab создаётся полный класс, нужно только указать имя модели.

Результат: экономия времени и единообразие кода.

VS Code для PHP - comments

En
Vs code php (php)