How to Implement Singleton Pattern without Nullable

时间:2015-06-15 14:49:50

标签: design-patterns singleton hhvm hacklang

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?

1 个答案:

答案 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;
  // ...
}