Создание фрагмента кода PHP в коде Visual Studio

Я немного запутался. Файл, который я редактирую в VScode, является файлом php, и приведенный ниже фрагмент кода не будет работать, если я помещу этот фрагмент в php.json, но это произойдет, если я вставлю этот фрагмент в html.json?!

Может кто-нибудь объяснить, почему фрагмент кода работает в одном, а не в другом?

"php": {
   "prefix": "php",
   "body": [ "<?php $1 ?>" ],
   "description": "php tag"
}

Кредит идет на оригинальный постер для приведенного выше фрагмента кода

3 ответа

Изначально PHP был разработан как простой язык шаблонов для HTML. Где у вас был статический HTML:

<p>Hello, World!</p>

… Вы можете заменить часть этого на динамически генерируемое значение:

<p>Hello, <?=$name?>!</p>
^^^^^^^^^^          ^^^^^ HTML
            ^^^^^^        PHP

Хотя в настоящее время это полноценный язык, он все еще поддерживает тот же базовый синтаксис встроенного языка.

Интерпретатор PHP на самом деле не заботится, является ли внешний язык HTML или чем-то еще, потому что он просто игнорирует все, что находится за пределами тегов PHP. Он читает исходный файл и печатает его как есть, но когда он находит открывающий тег PHP, он начинает анализировать и выполнять как код PHP все, что он находит внутри тега. Таким образом, можно использовать PHP в качестве движка шаблонов для всего: CSS, JavaScript, XML, простого текста, бинарных файлов... Что угодно. PHP не нужно знать или заботиться.

Текстовый редактор, такой как VisualStudio Code, сталкивается с другой ситуацией, поскольку окружающий язык имеет отношение к программисту, а значит, и к редактору. Если бы он заботился только о коде PHP, все, что находится за пределами тегов PHP, не имело бы ни подсветки синтаксиса, ни интеллигентности кода - не круто.

На практике есть две проблемы с этим:

  • Не существует стандартного надежного способа определения внешнего языка из редактора.

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

Поскольку, вероятно, в 99% случаев у нас есть PHP внутри HTML, большинство редакторов просто принимают внешний язык в .php Файл HTML и назовите это день.


Теперь, почему моя запись для <?php ?> в моем php.json файл сниппета вообще не работает (но работает когда в html.json) когда это явно тег PHP (и явно не тег HTML)?

Потому что, когда вы запускаете фрагмент, вы находитесь в контексте HTML. Ваша карета здесь:

<p>Hello, |</p>

… Так что VSCode ищет в HTML-фрагментах.

Если ваша карета была, например, здесь:

<p>Hello, <?=|?>!</p>

… Это должно работать безупречно, потому что вы находитесь в контексте PHP, поэтому VSCode ищет в фрагментах PHP (попробуйте!). Но это бессмысленная особенность, потому что вы не хотите вставлять теги PHP, когда вы уже находитесь в режиме PHP - это генерирует недопустимый PHP, потому что вы не можете вкладывать теги PHP.

Я хотел бы развить отличное объяснение Альваро Гонсалеса, предложив обходной путь для тех 99%, чей внешний контекст файла php является HTML. Вы можете добавить свой фрагмент тега php в свои фрагменты HTML .

  • Создайте файл, например: php.code-snippets в "/home/user-name/.config/Code/User/snippets/" , затем вставьте:
{
    «Тег PHP»:
    {
        "префикс": "php",
        "тело": ["<?php \n\t$1 \n?>"],
        "description": "Поместите тег php."
    }
}
  • затем ctrl+shift+p, выберите «разработчик: перезагрузить окно», чтобы перезапустить VsCode
Другие вопросы по тегам