如何在不为空的情况下实现单例模式



我正在尝试在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;
  // ...
}

相关内容

  • 没有找到相关文章

最新更新