检查是否从未分配过实例变量的好方法是什么。请考虑以下示例。 $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;
}
}
答案 0 :(得分:1)
我想这是一个黑客攻击,但是如果不设置呢?然后只需检查对象是否具有该属性。
class FooBar
{
//REMOVED
//protected $foo;
protected $db;
public function getFoo()
{
if (! property_exists($this, 'foo')) {
$this->foo = $this->db->getFooFromDatabase();
}
return $this->foo;
}
}
答案 1 :(得分:1)
没有办法保持单独的“分配到目前为止”的布尔标志。在大多数情况下,默认值(在这种情况下,通常为null
)充分充当哨兵,我不明白为什么它也无法在此示例中提供服务。您可以让查询方法在找不到foo时返回false
,或者您可以保留原样并使用false
作为属性的初始值。
我建议第一种方法:在查询数据库后返回null
大部分时间没有意义,null
的通常语义是“未知”。由于数据库只是被查询,代码 知道,即使知识“没有任何东西”。