我有点困惑。我在VScode中编辑的文件是一个php文件,如果我将片段放在php.json中,下面的代码片段将不起作用,但如果我将片段插入到html.json中,它会这样做?!
有人可以解释为什么代码片段在一个而不是另一个中工作吗?
"php": {
"prefix": "php",
"body": [ "<?php $1 ?>" ],
"description": "php tag"
}
对于上面的代码片段,可以转到original poster
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标签之外的所有内容都不会有语法高亮,也不会有代码intellisense - 不酷。
在实践中,有两个问题:
因为大概有99%的时间我们在HTML中使用PHP,大多数编辑只是假设.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。