为什么PHP允许3;声明?

时间:2011-08-05 16:39:22

标签: php

<?php

3;

在PHP中有什么样的陈述?

我无法想出一个有用的案例......

5 个答案:

答案 0 :(得分:7)

你是对的,它是“无用的”(更正式地,它没有效果 - 加载整数三然后丢弃)。它自然地来自两个事实:

  • 3是一个有效的表达式(您无法使用它,例如在$x < 3中,如果不是)。
  • 表达式也是有效的陈述。 分配是表达式,您不希望独立分配出错。即使赋值是语句,下一个例子,调用不返回有意义值的函数,仍然是非常常见和有用的。

禁止使用无效的语句既困难(需要非常聪明的AST分析,也许,对于更复杂的情况,还有一些AST转换,例如常量折叠以使它们可见),不可能完全对(总会有一些错过的东西;在动态语言中加倍)并且很少有用。

请注意,几乎所有其他语言都有这种权衡 - 要么实现复杂的编译器传递以禁止它(可能会遗漏更多细微的情况),要么忽略它。这甚至适用于在某种程度上只有 表达式的语言,当然除了没有语句,你会调用忽略值的表达式无用。

答案 1 :(得分:1)

这可能是一个让它不被允许会比它的价值更多的工作。它显然没有任何用处,所以程序员可能会避免这种事情。

要考虑的一件事是:

some_function("foo");

3;

在语法上是一样的。

答案 2 :(得分:0)

它没有用,但允许。

每一段代码都在PHP中表达为3。 (ex $ v = 17也是值为int(17)的表达式,print 17也是值为int(1)的表达式)

所以代码是 <?php expr;expr;expr; ?>

为什么不允许这样做?

答案 3 :(得分:0)

AFAIK,你可以在JS和Python中做到这一点,除了JS,PHP / Python我什么都不知道但是它应该适用于大多数,你可以安全地运行这三个中的任何一个{{ 1}}或3;,请注意您在Python语句末尾不需要半冒号

答案 4 :(得分:0)

在编程语言中,它是否有用取决于你所写的内容。

编译器(虽然php不是一个编译的lang)会检查它们是否是任何syntex错误。并且没有理解它是否有用。所以对于php它是有效的。

如果我们在JAVA中编写相同的代码,我们将生成

  

未解决的编译问题:       语法错误,插入“AssignmentOperator Expression”以完成表达式       赋值的左侧必须是变量

iN c#IT will PRODUCE

  

错误1只能将赋值,调用,递增,递减和新对象表达式用作语句

不同的语言有不同的“类型检查”。