I am trying to implement the Singleton pattern in Hack. However, I keep running into issues with Nullable.
<?hh //strict
class Foo {
private static Foo $foo;
public function __construct() {
// Do stuff here.
}
public static function theFoo(): Foo {
if (null === self::$foo) {
self::$foo = new Foo();
}
return self::$foo;
}
}
$aFoo = Foo::theFoo();
When executed I get the error:
Catchable fatal error: Hack type error: Please assign a value at foo.hh line 4
The type checker returns a similar as well:
foo.hh:4:24,27: Please assign a value (Typing[4055])
How do I assign a default value to a static property?
答案 0 :(得分:2)
如何为静态属性分配默认值?
如果它是一个对象,就像在这种情况下一样,你就不能这样做。使用原语,您可以执行以下操作:
<?hh // strict
class Foo {
private static int $x = 0;
// ...
}
但是,对于对象,您需要说private static Foo $x = new Foo()
这是不允许的 - 您不能像这样初始化静态变量,因为它必须调用构造函数,这涉及到运行代码,PHP没有初始化顺序和运行代码这样的概念(其他语言,特别是C ++,如此)。我们没有深刻的技术理由没有这样的概念,它现在只是语言的一部分。
正确的做法就是制作静态nullable。你实际上已经隐含地对待它了,当你执行if (null === self::$foo)
时 - self::$foo
实际上不能为空,因为你还没有给它一个可空类型,以便检查什么也不做。您可能想要做的是:
<?hh // strict
class Foo {
private static ?Foo $foo;
// ...
}