首页 > 解决方案 > 在 Visual Studio Code 中创建 PHP 代码片段

问题描述

我有点困惑。我在 VScode 中编辑的文件是一个 php 文件,如果我将代码片段放在 php.json 中,下面的代码片段将不起作用,但如果我将片段插入 html.json,它会起作用?!

有人可以解释为什么代码片段在一个而不是另一个中起作用吗?

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

归功于上述代码片段的原始海报

标签: phpvisual-studio-codecode-snippets

解决方案


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% 的时间我们在 HTML 中使用 PHP,因此大多数编辑器只是假设.php文件中的外部语言是 HTML,然后就收工了。


现在,为什么<?php ?>我的php.json片段文件中的 for 条目根本不起作用(但在 中时起作用html.json),而它显然是一个 PHP 标记(并且显然不是 HTML 标记)?

因为当您触发代码段时,您处于 HTML 上下文中。您的插入符号在这里:

<p>Hello, |</p>

……所以 VSCode 在 HTML 片段中搜索。

如果您的插入符号在这里:

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

…它应该可以完美地工作,因为您在 PHP 上下文中,因此 VSCode 在 PHP 片段中搜索(试试吧!)。但这是一个毫无意义的功能,因为您不想在已经处于 PHP 模式时插入 PHP 标记,因为您不能嵌套 PHP 标记,所以会生成无效的 PHP。


推荐阅读