1

我在另一个 SE 站点上的某些代码中发现此功能被提倡为“好”。

public static function init()
        {
            is_null( self::$instance ) AND self::$instance = new self;
            return self::$instance;
        }

有人可以用英语解释一下这条线吗?

is_null( self::$instance ) AND self::$instance = new self;

我不想听你为什么认为singletons不好。我知道这段代码旨在返回包含类的实例,但我只是不明白如何阅读这一行。结果是self::$instance = new self;什么?

4

3 回答 3

2

那是完全干净的代码。该行首先测试单例是否已经存在,如果存在则返回。如果没有,则创建一个新实例,存储在单例类静态实例属性中并返回。

人们可能会偶然发现使用AND运算符的非常规表示法。但这是完全有效的 PHP 代码:AND只有在前面的条件为真时才会执行后面的部分所以如果在这种情况下不存在对象。

构造分配的结果(返回值)在此self::$instance = new self无关紧要。它已经完成了它的职责,对象被创建了。我个人更喜欢将这个构造写在 backets 中。但一般来说,赋值运算符在以这种方式评估时也有返回值。这就是为什么你也可以使用这种结构来编写非常干净的代码:if (FALSE===($result=action())) {do_something();}.

于 2013-10-24T13:11:59.120 回答
2

它基本上意味着 if self:$instanceis null, make self:$instance new self

更详细的方法是:

if(is_null(self::$instance)){
    self::$instance = new self;
}

要回答您的实际问题,结果self::$instance = new self;将是true,但这无关紧要,因为我们只是使用它来分配变量本身。

于 2013-10-24T13:13:06.597 回答
0

结果self::$instance = new self;是静态$instance变量被当前对象初始化(因为它事先不存在)。

于 2013-10-24T13:11:26.550 回答