Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么重构类型化语言更容易?_Php_Programming Languages_Hacklang - Fatal编程技术网

Php 为什么重构类型化语言更容易?

Php 为什么重构类型化语言更容易?,php,programming-languages,hacklang,Php,Programming Languages,Hacklang,我正在浏览Facebook的文档,它说它的优点之一是可重构性。为什么Hack比PHP更容易重构,仅仅因为它是部分类型的?我不使用Hack,但从它们的文档中可以看出,它们允许非常精确的类型注释,比如 function(int, int): string // function that takes two ints and returns string 或 array//带有字符串键和int值的数组 与参数化类型一起,这使得一个丰富的类型系统可以与C#or相媲美 关于静态类型是否确实有助于重构

我正在浏览Facebook的文档,它说它的优点之一是可重构性。为什么Hack比PHP更容易重构,仅仅因为它是部分类型的?

我不使用Hack,但从它们的文档中可以看出,它们允许非常精确的类型注释,比如

function(int, int): string // function that takes two ints and returns string

array//带有字符串键和int值的数组
与参数化类型一起,这使得一个丰富的类型系统可以与C#or相媲美

关于静态类型是否确实有助于重构的观点是。毫无疑问,它使IDE能够对您的代码进行奇妙的处理。

首先,PHP是类型化的。它不是静态类型的,但它肯定有一个定义良好的类型系统。不同类型的系统有不同的目标,但通常类型用于将代码的某些部分标记为特定的“事物”,并将代码的其他部分标记为处理特定的“事物”。例如,一个变量标记为“这是一个int”,另一个函数标记为“此参数必须是一个int”

使用这些标签的方式、地点和时间因语言而异。PHP非常宽松,允许您将字符串传递给标记为需要int的函数,因为PHP的类型转换将动态处理此类不兼容性(在某种程度上)。这仍然意味着您需要传递通常与预期类型兼容的值。不能将数组传递给需要int的函数,因为这没有意义

现在,工具可以使用这些类型信息来帮助您构造有效的代码。如果您试图将已知的数组传递给它知道需要int的函数,IDE会发出警告。这是一个很早就发现的错误。如果IDE不这样做,编译器或静态分析工具可能会。这是一个小虫子被抓到后,但仍然被抓到。尽管PHP在执行之前通常不会通过编译器运行。最后一种方法是运行时系统在遇到不兼容的类型时抛出一个错误,这已经很晚了,可能很难捕获和调试

因此,具有严格类型注释的语言为这条链上的许多工具提供了大量信息,有助于及早发现错误。当然,并非所有情况下都存在错误,但它们可以帮助在早期消除大量错误。当您重构代码时,这将非常有助于避免将两个不兼容的代码粘在一起。非常好的工具甚至可以基于这些兼容性元信息对代码结构进行推理,并建议简化或重构

但是,即使在普通的旧PHP中,您也可以获得类型注释的好处。许多IDE支持注释注释,例如:

/**
 * @param int $bar
 * @return string
 */
function foo($bar) {
   ...
}
这提供了与Hack中相同的类型信息:

function (int): string
除了它没有融入语言本身,可能是正确的,也可能不是。但它提供了相同的好处,像IDE这样的工具可以根据这些信息帮助您编写代码。好的IDE甚至会根据对代码的推理自行检测类型,甚至指出注释和实际代码之间的差异

因此,像Hack这样的语言具有严格的类型注释,具有开箱即用的显式类型系统的优点,并在编译过程中强制执行这些类型,这有助于在代码实际运行之前尽早发现某些问题。普通PHP只有非正式的类型注释*,外部工具可以使用,也可以不使用,并且只能在运行时捕获实际问题。然而,这些工具确实存在,所以总的来说,在我看来,这几乎是一场洗礼



*PHP确实对其OO组件以及一些复杂类型(如数组和可调用项)提供了完整的正式类型暗示支持。但是,这些只在运行时由PHP本身使用;运行前分析依赖于第三方工具。

我不一定确定这一点。请注意,几乎所有语言都是键入的。很少有语言完全没有类型系统。PHP当然也是类型化的。有了正确的工具和可能的注释,它几乎可以像其他“类型化”语言一样严格地类型化。当然是为了重构的目的。
function (int): string