1

我正在尝试在 Hack 中实现单例模式。但是,我一直遇到 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])

如何为静态属性分配默认值?

4

1 回答 1

2

如何为静态属性分配默认值?

如果它是一个对象,就像在这种情况下,你不能。使用原语,您可以执行以下操作:

<?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;
  // ...
}
于 2015-06-15T17:14:49.737 回答