2

检查实例变量是否从未分配过的好方法是什么。考虑以下示例。$this->foo为空开始。如果$this->foo在数据库中找到,后续调用getFoo()不会查询数据库。但是,如果数据库中没有任何内容被返回(null),那么所有后续调用仍然会命中数据库......不好。

class FooBar 
{    
  protected $foo;
  protected $db;    

  public function getFoo()
  {
    if (is_null($this->foo)) {
      $this->foo = $this->db->getFooFromDatabase();
    }

    return $this->foo;
  }
}
4

2 回答 2

1

除了保留一个单独的“迄今为止分配的”布尔标志之外,没有办法做到这一点。在大多数情况下,默认值(在这种情况下,通常是null)足以作为哨兵,我不明白为什么在这个例子中它也不能提供服务。您可以让您的查询方法false在没有找到 foo 时返回,或者您可以保持原样并false用作属性的初始值。

我建议第一种方法:null在查询数据库后返回大多数时候没有意义,通常的语义null是“未知”。由于只是查询了数据库,因此代码确实知道,即使知识“那里什么也没有”。

于 2013-10-18T20:06:01.413 回答
1

我想这有点小技巧,但是不设置它怎么样?然后只需检查对象是否具有该属性。

class FooBar 
{   
  //REMOVED
  //protected $foo;
  protected $db;    

  public function getFoo()
  {
    if (! property_exists($this, 'foo')) {
      $this->foo = $this->db->getFooFromDatabase();
    }

    return $this->foo;
  }
}
于 2013-10-18T20:04:53.063 回答