停止生成PDO :: FETCH_CLASS不存在的成员变量

时间:2012-08-07 16:13:05

标签: php pdo

当我们使用PDO::FETCH_CLASS时,使用公共范围创建指定类的成员变量。如何防止此默认行为并停止创建这些公共成员?

class user
{
/**
Table user has
id int PK
name UNIQUE
password
*/
protected $id;
protected $name;
/*more code.......*/
}

 $stmt->setFetchMode(\PDO::FETCH_CLASS, 'user');
 $user=$stmt->fetch();

现在如果我var_dump() $ user它有'password'公共属性。我想阻止

1 个答案:

答案 0 :(得分:0)

我能找到的唯一一个我认为可以接受的解决方案(我仍然不会喜欢它)是将获取模式设置为PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE并定义为空__set()方法 - 或者至少是一个如果不存在则不设置属性的方法。

请根据您的上述代码向您展示:

class user {

  protected $id;
  protected $name;

  public function __set ($name, $val) {
    if (property_exists($this, $name)) {
      $this->$name = $val;
    }
  }

}

$stmt->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, 'user');
$user=$stmt->fetch();

这是工作但正如我所说的那样不喜欢它,主要是在你的例子中,因为它允许从{<1}}属性设置在外面,为了规避这一点,你开始做一些可怕的事情来创造额外的属性,以表明锁定和各种类似的废话。