Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 停止生成PDO::FETCH_类中不存在的成员变量_Php_Pdo - Fatal编程技术网

Php 停止生成PDO::FETCH_类中不存在的成员变量

Php 停止生成PDO::FETCH_类中不存在的成员变量,php,pdo,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=$st

当我们使用
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();

现在,如果i
var\u dump()
$user,则它具有“password”公共属性。我想防止

< p>唯一的解决办法是,我认为可以接受的(并且我仍然不喜欢它)是将获取模式设置为<代码> pdo::FuffChug类pDo::FutChyPrimsSuthAudio//Cuth>并定义一个空的< < > >代码>()/>代码>方法,或者至少,如果不存在,则不设置属性。 因此,要根据上述代码向您展示:

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

这确实有效,但正如我所说,我不喜欢它,主要是在您的示例中,因为它允许从外部设置
受保护的
属性,为了避免这种情况,您必须开始做一些可怕的事情,创建额外的属性来表示锁定和诸如此类的废话。

将有问题的项创建为私有成员,并且不会填充值,但我怀疑这不是您想要的。它还可能导致PDO抛出一个未检查的异常。我怀疑答案是“你不能”,你只能接受它。不过我很高兴被证明是错的。这和提到私人会员有点关系too@Cups有趣的是,这个问题似乎表明,这个问题所要问的如何避免的事情无论如何都不会发生。我现在正在测试它到底有什么作用。我已经更新了我的帖子来澄清这个问题problem@user1538127我明白(并重复)了这个问题。这可能是一个明显的问题,但您不能不在查询的字段列表中包含不需要的字段吗?除此之外,我可以想出一个有点难看的解决办法,但我认为不获取你一开始不想要的数据将是最好的解决方案。