0

当我们使用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 它具有“密码”公共财产。我想防止

4

1 回答 1

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();

这确实有效,但正如我所说我不喜欢它,主要是在您的示例中,因为它允许protected从外部设置属性,并且为了避免这种情况,您开始不得不做一些可怕的事情来创建额外的属性来指示锁定和诸如此类的各种胡说八道。

于 2012-08-07T16:46:06.540 回答