我最近遇到了这个PHP标签<?= ?>,我不愿意使用它,但是它痒得很厉害,以至于我想请您使用。我知道使用短标签<? ?>是一种不好的做法,而应该使用完整标签<?php ?>,但是这种情况呢:<?= ?>? ,IMO。所以代替这个:

<input name="someVar" value="<?php echo $someVar; ?>">


我可以这样写,它更干净:

<input name="someVar" value="<?= $someVar ?>">


使用此运算符是否会感到皱眉?

评论

这种问题的问题在于,它是如此自以为是。 “技术上”不是正确或错误的方法。有些人主张,有些人反对,它的全部偏好。所以最终取决于您。

如果可以,请避免使用任何形式的结束标记-即该文件仅包含php代码(不包含html等)。如果您有结束标记,则其后的所有字符都会输出到浏览器(对于Web应用程序),这可能会导致很难调试问题。有关更多信息:stackoverflow.com/a/4453835/49560

与非意见无关:要小心,因为echo很容易引导到XSS,因此您最好依靠上下文专用的echo方法(即:具有html($ x)函数{echo htmlentities($ x,...);}和un html($ someVar);而不是echo $ someVar或对JS上下文使用echo json_encode($ x);)。这样一来,<?=标记就成为一种不好的做法,因为这意味着您已经在另一个地方用HTML转义了变量内容,因此其他地方必须神奇地知道必须对该变量进行HTML转义,因为它在HTML上下文中回显了。 >

#1 楼

历史记录

在错误信息提示出站之前,您需要了解很多有关PHP短标签的知识。

PHP短标签的主要问题标签是PHP设法选择了另一种语法XML使用的标签(<?)。

启用该选项后,您将无法原始输出xml声明而不会出现语法错误:

<?xml version="1.0" encoding="UTF-8" ?>


考虑到XML解析和管理的普遍性,这是一个大问题。

<?=呢?

尽管<?与xml引起冲突,但<?=不会。不幸的是,将其打开和关闭的选项与short_open_tag绑定在一起,这意味着要获得短回显标签(<?=)的好处,您必须处理短打开标签(<?)的问题。与短打开标记相关的问题远比从短回显标记带来的好处要大得多,因此,您将发现一百万个建议关闭short_open_tag,这是应该的。 5.4,但是短回显标记已与short_open_tag选项分开重新启用。我认为这是对<?=便利性的直接认可,因为从本质上讲,它本身并没有什么毛病。我正在尝试编写可在更广泛的PHP版本中使用的代码。

好,所以现在一切都已经排除了

应该使用<?=吗?



评论


我不同意你的图表。正确答案是99.99%是,因为大多数生产环境都配置为使用短标签。假设您自爆它,并且将来删除了<?=,您可以在不到一分钟的时间内修复它,无论使用了成千上万个文件,您只需在项目范围内搜索<?=替换为<? PHP的回声。我的答案是不用担心,只需使用它,好处就会大大超过后果。 <?=不再被视为短标签,Rasmus Lerdorf自己做了这个承诺。

–dukeofgaming
2012年6月8日在0:07



@dukeofgaming,您将从何处获取有关配置为使用短标签的生产环境的数据?禁用它们是我听说过的最常见的建议配置之一,仅次于禁用魔术引号。拥有与生产环境不同的开发环境也绝对没有意义。

–zzzzBov
2012年6月8日在0:11



短标签默认情况下处于启用状态,直到5.3 php.net/manual/en/ini.core.php#ini.short-open-tag,我知道的大多数托管服务都毫无问题地支持它,这就是Kohana框架的原因之一曾经鼓励它。 <?=将始终处于打开状态(stackoverflow.com/a/6064813/156257),并且大多数时候它们一直处于打开状态。您可以通过与您的主机进行核对来证明我是错误的:是否已禁用主机,并使用PHP <5.3,以及是否不允许用户或根据特殊要求覆盖该设置;如果前面的所有条件均为假,则一定要担心<?=。

–dukeofgaming
2012年6月8日在1:30



您不必担心<?=会被删除,我也不是。其他人也可能会删除,如果是,则不必使用<?=。有些人对使用某些语言功能(例如在php中关闭结束标记)有非理性的恐惧。

–zzzzBov
2012年6月8日18:11

这正是我的观点:无需担心。我只说“你担心吗?” -是->“继续使用它们,无需担心”。感觉就像您在暗示关闭结束标记是一种不好的做法,事实并非如此。

–dukeofgaming
2012年6月8日19:14

#2 楼

抛弃我的PHP帽子

我绝对更喜欢使用<?= $someVar ?>,而不是更冗长的echo(仅仅是个人喜好)。唯一的缺点是面向5.4.0之前的用户,在这种情况下,必须在php.ini中启用short_open_tag

现在已经说过,如果您的项目不是OS,这是有争议的。如果是这样,我要么记录必须启用short_open_tag的事实,要么使用这两种解决方案中的更便携式的方法。

评论


Nitpick:即使<?=不受PHP 5.4上的short_open_tag影响,仍然如此,如果您习惯使用短格式标签,则很容易忘记哪个版本支持什么。

– yannis
2012年6月5日18:26

@YannisRizos最好将<?=区分为“我正在输出一个变量”以用于模板样式,而将<?php区分为“我正在运行大量代码”。我建议不要使用
–伊兹卡塔
2012年6月5日19:31

+1是因为Rasmus Lerdorf认可了速记<?=标签。我观看了他关于PHP 5.4(随后即将发布)的演讲之一。这就是为什么从PHP 5.4.0开始,<?=标记始终可用。我已经看到PHP 5.4之前的许多代码,其中<?=标记用于MVC应用程序的View中,而<?php ...?>用于非视图文件中。

–程序员
2012年6月5日在20:40

@Jason我不是这个意思。 “拉斯穆斯认可foo”不是一个参数,而是“拉斯穆斯为此而认可foo”。

– yannis
2012年6月6日的15:00

@Yannis Rizos“拉斯莫斯为此支持foo”,但确实如此。感谢您的指导,但我的理由是自Rasmus Lerdorf认可它以来,作为语言的创建者并仍对PHP的发展产生影响,因此进行了更改以使<?=标签始终可用。这就是我应该在原始注释中添加的内容,“因此在视图中使用<?=的做法可能会变得更加普遍。”亲爱的,现在我需要在...点上三重检查我的评论。

–程序员
2012年6月6日15:25

#3 楼

绝对应该避免使用简写形式的标签,无论是<?还是<?=

主要的技术原因是可移植性,您永远不能确定短格式标签对于每种给定设置都适用,因为可以将其关闭,请查找short_open_tag指令。但是,您始终可以肯定,长格式可以在任何地方使用。 >
这也是一个坏习惯。我无法真正告诉您您发现什么更具可读性,但是我强烈反对使用代码可读性作为借口,以节省几次击键。如果您担心可读性,则应该选择模板引擎,这对您的两个示例来说,可读性都更高。



最后,值得注意的是,主要的PHP项目(例如PEAR和Zend Framework)明确禁止使用简短形式的标签。

评论


为模板+1。 -1为可移植性。它是一种服务器端语言。服务器需要重点关注的挑战是可伸缩性和安全性。花大量的时间来确保它可以在多个平台上运行,这是一个非常糟糕的主意……(以防万一!)……

–riwalk
2012-6-5 18:55



@ Stargazer712嗯?您唯一需要做的就是使用标准<?php和echo代替<?和<?=,您认为那是严肃的时间吗?当您将项目移至由于某些原因禁用短标签的服务器时,会发生什么?

– yannis
2012-6-5 18:58



@Yannis:这几个字符看起来似乎不多,但IMO它们会增加很多噪音。

–kevin cline
2012年6月5日19:24

我认为应该提到,PHP的最初目的是成为模板语言。在PHP之上添加另一个模板引擎(更加膨胀)不会使我的金枪鱼船浮起。在将PHP和HTML混合编码时,只需遵循良好的实践(一些好的技巧在这里stackoverflow.com/questions/62617/…),就可以了。

–程序员
2012年6月5日在20:49



@Yannis Rizos是的,应该提到,因为PHP新手可能会认为他们有义务在其PHP项目中使用[whizbang]模板引擎,而不考虑使用纯PHP。我应该只在Perl中执行文本处理,也许不是,但是我认为,到目前为止,Perl擅长于文本处理-与PHP和模板化一样。

–程序员
2012年6月6日15:14



#4 楼

PHP文档明确指出,您可以安全地使用简短的echo标签:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

尽管这适用于PHP 5.4和更高版本,但每个人至少应该使用此版本。我希望它们仅用于模板目的。

#5 楼

使用短标签的原因:


它们较短。

不使用短标签的原因:


引入另一个配置陷阱-虽然您通常会在专业环境中控制服务器,但如果您打算将代码发布给公众,则短标签对于使用例如共享主机的人可能无法修复。
它们使将未经消毒的字符串随意放入输出中变得非常容易。这很可怕,因为它可能会引入XSS漏洞。尽管长标签没有直接采取任何措施来防止这种情况的发生,但是它们确实向程序员发出信号,表明他们所做的事情可能不正确,它们应该开始使用一种模板系统,该模板系统现在可以自动为其处理HTML编码。输出带有长标签的动态字符串很麻烦,这是一件好事(有教益)。


评论


这就是接受IMO的答案,即使模板也无法保证XSS的一切安全(脚本的src属性中的用户数据始终不安全),而且我不知道模板机制是否知道适当的回显上下文;如果PHP变量最终出现在脚本标签内容中怎么办?在SVG中嵌入HTML吗?

– Xenos
19年3月23日在12:53

@Xenos显然取决于所讨论的模板系统,并且没有灵丹妙药;但是大多数方法的确可以减少错误的面,并减少需要人工努力(安全性错误的最重要的单一来源)的场景数量。 “不要在脚本标记中放入动态内容”比“确保所有动态内容在任何地方都正确地进行HTML编码”更容易遵循和审核。

– tdammers
19年4月4日在8:28

#6 楼

我认为<?=版本是一种好的/可以接受的做法,前提是您只能将其用于变量的最终输出,并避免任何与数据表示没有直接关系的函数调用或三元逻辑。 >
它肯定比<? echo($x); ?>都好得多。

长期来看,您可能希望研究诸如Smarty之类的模板引擎。

评论


Smarty曾经是模板引擎,但是现在它是一个过时且肿的混乱局面,您应该切实避免。

– yannis
2012-6-5 18:51



#7 楼

从PHP 7.4开始,竞争环境有所变化:

<? ?>已正式弃用,并将在PHP 8.0中删除。 <?= ?>不受影响。这将表明(根据我,不是RFC)不鼓励其使用。

评论


后续行动:wiki.php.net/rfc/deprecate_php_short_tags_v2

– Lohardt
20 Mar 10 '20在9:12

#8 楼

老实说,我认为在MVC已经庆祝33年之际,无论采用哪种方法(旧的或新的方式),都要回显一个结果已经很过时了。将传入的服务器(php)数据封装到XML文档中,并在您的应用程序/客户端层中对其进行处理,从而甚至节省了使用此类标签的想法。

评论


实际上,MVC庆祝33周年,它在1979年12月首次概述。

– yannis
2012年6月5日19:54

是的,我仍然在2000年,我的错误:-)

–sebas
2012年6月5日19:59

嗯...模板...模板过时了吗?模板和MVC是否互斥?

– Tim Seguine
2015年9月30日10:25在