【问题标题】:Hacklang: How do I type-annotate a local/global variable?Hacklang:如何对局部/全局变量进行类型注释?
【发布时间】:2014-04-15 14:54:35
【问题描述】:

Hack 手册非常清楚地说明了如何对函数参数、函数返回类型和成员变量进行类型注释。但是,我尝试对全局变量或函数局部变量进行类型注释的所有方法都会导致语法错误:

string $foo   = "foo";        // unexpected T_VARIABLE
$foo : string = "foo";        // unexpected ':'
string $foo;   $foo = "foo";  // unexpected T_VARIABLE
$foo : string; $foo = "foo";  // unexpected ':'

这样的注释可能吗?如果可能,那么正确的语法是什么?如果不可能,那么这是设计使然,还是开发人员计划实现的? (肯定会有用。)

【问题讨论】:

    标签: global-variables hacklang type-annotation


    【解决方案1】:

    这是不可能的,这是设计使然。

    局部变量的类型被推断出来,全局变量不会被类型检查(因为它们可以通过访问$_GLOBALS随时从任何地方更改)。

    如果有特定的文档页面可以更清楚地说明这一点,请单击其底部的“File A Documentation Bug”链接,以便添加。

    【讨论】:

    • 有道理。所以可能在未来我们将能够注释局部变量,但没有计划允许全局变量这样做,因为 PHP 语义使得类型检查变得困难。
    • @jameshfisher 实际上是因为全局范围内变量的类型和内容可以随时从任何其他类/函数/等更改。这可以通过访问$_GLOBALS 来完成。这与全局范围内的代码永远不会通过 HHVM 的 JIT 编译器传递的原因相同。
    • @jameshfisher 有什么特别的原因想要注释局部变量吗?它们由类型检查器推断,因此程序员无需这样做......
    • @Claudiu 主要是为了清楚起见。说,我声明了一些局部变量,它应该是某种复杂的shape 类型:如果初始值不满足该类型,那么在声明/初始化时出现错误会很好,而不是在某些稍后在我尝试使用该值的程序中指出。
    • 明白詹姆斯,这是有道理的。请注意,类型检查器会指出错误中的分配位置,而不仅仅是错误的位置 - 所以在大多数情况下,识别罪魁祸首应该不是问题。如果它更多是为了其他人阅读您的代码的文档目的,那是另一回事:)
    猜你喜欢
    • 2017-11-05
    • 2020-12-05
    • 2012-12-16
    • 1970-01-01
    • 2019-07-24
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多