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


stop generting member variables which does not exist with PDO::FETCH_CLASS

当我们使用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它具有"密码"公共属性。 我想防止

我能找到的唯一我认为可以接受的解决方案(我仍然不太喜欢它)是将获取模式设置为 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();

这确实有效,但正如我所说,我不喜欢它,主要是在您的示例中,因为它允许从外部设置protected属性,为了规避这一点,您开始不得不做可怕的事情创建额外的属性来指示锁定和各种废话。