日安,
我有问题。我想模拟一下哈克兰的一些错误。
<?hh
namespace Exsys\HHVM;
class HHVMFacade{
private $vector = Vector {1,2,3};
public function echoProduct() : Vector<string>{
return $this->vector;
}
public function test(Vector<string> $vector) : void{
var_dump($vector);
}
}函数echoProduct()返回字符串的向量。但私有属性$vector是整数的向量。当我调用echoFunction并返回值时,使用函数test()作为参数。我得到了
object(HH\Vector)#35357 (3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }为什么?我预期会出现一些错误,因为类型不匹配。
发布于 2015-10-08 21:48:49
这里有两件事在起作用:
Vector。$this->vector本身没有被输入。这意味着类型检查器(hh_client)将其视为未知类型。未知类型与所有类型匹配,因此返回期望Vector<string>的未知类型是没有问题的。
这是为了允许您逐步键入代码。每当不知道类型时,类型检查器就假设开发人员知道发生了什么。我要做的第一件事是将文件从部分模式更改为严格模式,这只需将<?hh更改为<?hh // strict。这会导致类型检查程序抱怨缺少的任何类型信息(以及其他一些事情,比如没有超级全局,您不能调用非Hack代码)。
这会产生错误:
test.hh:6:13,19: Please add a type hint (Naming[2001])如果然后将$vector键入为Vector<int> (private Vector<int> $vector),则hh_client将生成:
test.hh:9:16,28: Invalid return type (Typing[4110])
test.hh:8:44,49: This is a string
test.hh:6:20,22: It is incompatible with an int
test.hh:8:44,49: Considering that this type argument is invariant with respect to Vector这就是你所期望的错误。您也可以通过将类型添加到$vector,而不切换到严格模式来获得此错误,尽管我更喜欢在代码支持的最强模式下编写Hack。
在HHVM的最新版本中,每当运行Hack代码时都会调用类型检查器(有一个INI标志来关闭它),因此导致类型不匹配也会导致代码执行失败。
https://stackoverflow.com/questions/33021593
复制相似问题