我正在阅读Facebook Hack language的文档,它说其中一个优点是可重构性。为什么Hack比PHP更容易重构,因为它是部分键入的?
答案 0 :(得分:2)
首先,PHP 是类型。它不是静态类型,但它肯定有一个定义良好的类型系统。不同类型的系统有不同的目标,但通常类型是将代码的某些部分标记为某种特定的东西"并标记代码的其他部分以使用某些"事物"。例如。变量标记为"这是一个int" ,另一个函数标记为"此参数必须是int" 。
使用这些标签的方式,地点和时间因语言而异。 PHP非常宽松,允许您将字符串传递给标记为需要整数的函数,因为PHP的类型杂耍将动态处理这种不兼容性(在某种程度上)。这仍然意味着您需要传递通常与预期类型兼容的值。
,你无法将数组传递给期望int的函数现在,工具可以使用此类型信息来帮助您构建有效的代码。如果您尝试将它知道的数组传递给它知道需要int的函数,您的IDE可以发出警告。这是一个很早就发现的错误。如果您的IDE没有这样做,编译器或静态分析工具可能会。这是一个稍后发现的错误,但仍然被抓住了。虽然PHP在执行之前通常不会通过编译器运行。最后一种情况是运行时系统在遇到不兼容的类型时抛出错误,这很晚,可能很难捕获和调试。
因此,具有严格类型注释的语言为此链中的许多工具提供了大量信息,并有助于及早发现错误。当然不是所有情况下的所有错误,但它们可以帮助在早期消除大量错误。当您重构代码时,这可能非常有助于避免尝试将两个不兼容的代码片段粘在一起。非常好的工具甚至可以基于这些兼容性元信息来推断您的代码结构,并建议简化或重组。
但是,即使在普通的旧PHP中,您也可以获得类型注释的好处。许多IDE支持注释注释,例如:
/**
* @param int $bar
* @return string
*/
function foo($bar) {
...
}
这提供了与Hack相同的类型信息:
function (int): string
除非它没有融入语言本身,可能或可能不是正确的。但它提供了相同的好处,例如IDE可以根据这些信息帮助您处理代码。好的IDE甚至可以根据代码的推理自行检测类型,甚至指出注释与实际代码之间的差异。
因此,像Hack这样的语言具有严格的类型注释,它具有开箱即用的显式类型系统的优点,并在编译过程中强制执行这些类型,这有助于在编译过程之前捕获某些问题。代码实际上是运行的。普通PHP只有非正式的注释*外部工具可能使用也可能不使用,只能在运行时捕获实际问题。但是,这些工具做存在,所以总的来说它只是一个洗,IMO。
* PHP 对其OO组件以及某些复杂类型(如数组和可调用对象)具有完整的正式类型提示支持。但同样,这些仅在运行时由PHP本身使用;您依赖第三方工具进行运行前分析。
答案 1 :(得分:0)