我有点困惑。我正在VScode中编辑的文件是一个php文件,如果我将代码段放入php.json中,则下面的代码段将不起作用,但是如果我将代码段插入html.json中,它将起作用。 >
有人可以解释为什么代码片段在一个而不是另一个中起作用吗?
"php": {
"prefix": "php",
"body": [ "<?php $1 ?>" ],
"description": "php tag"
}
上述代码段的信用转到original poster
答案 0 :(得分:0)
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标记。