我正在尝试在Hack中实现Singleton模式。但是,我一直遇到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();
执行时出现错误:
Catchable fatal error: Hack type error: Please assign a value at foo.hh line 4
类型检查器也返回类似的:
foo.hh:4:24,27: Please assign a value (Typing[4055])
如何为静态属性分配默认值?
如何为静态属性分配默认值?
如果它是一个对象,就像在这种情况下,你不能。使用基元,您可以执行以下操作:
<?hh // strict
class Foo {
private static int $x = 0;
// ...
}
但是,对于对象,你需要说private static Foo $x = new Foo()
哪些是不允许的 - 你不能像这样初始化静态变量,因为它必须调用构造函数,这涉及运行代码,而 PHP 没有初始化顺序的概念和像这样运行代码(其他语言,特别是C++,这样做)。没有深刻的技术原因,我们不能有这样的概念,它只是现在不是语言的一部分。
正确的做法是使静态可为空。实际上,当您执行if (null === self::$foo)
时,您已经隐式地将其视为这样 - 正如所写的那样,self::$foo
实际上不能为空,因为您没有给它一个可为空的类型,因此检查不执行任何操作。您可能打算这样做:
<?hh // strict
class Foo {
private static ?Foo $foo;
// ...
}