当我们使用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
属性,为了规避这一点,您开始不得不做可怕的事情创建额外的属性来指示锁定和各种废话。