php检查是否声明了实例变量但未分配

时间:2013-10-18 20:01:05

标签: php

检查是否从未分配过实例变量的好方法是什么。请考虑以下示例。 $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;
  }
}

2 个答案:

答案 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的通常语义是“未知”。由于数据库只是被查询,代码 知道,即使知识“没有任何东西”。