PDO :: FETCH_CLASS没有将类名作为参数传递

Don*_*lly 3 php mysql pdo

我遇到了一段代码,其中PDO::FETCH_CLASS没有将类的名称作为参数传递,而是这样:

  function getUsers() {
    $DBH = $this->getDbh();
    $query = "SELECT * FROM users";

    try {
      $STH = $DBH->query($query);
      $users = $STH->fetchAll(PDO::FETCH_CLASS);
    } catch(PDOException $e) {

    }

    return $users;
  }
Run Code Online (Sandbox Code Playgroud)

现在,在官方文件中 它说:

如果fetch_style包含PDO :: FETCH_CLASSTYPE(例如PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE),则类的名称由第一列的值确定.

所以我不确定我究竟是什么意思,也不知道它是如何运作的.假设我有users一张记录表

  • ID:1
  • 名称:乔什
  • 等......

那怎么能PDO::FETCH_CLASS知道什么是班级名字?我可以用类名添加列到我的记录中,FETCH_CLASS从数据库中获取类名吗?记录结构的例子将受到高度赞赏...... thx

*我正在测试这个类而不是作者,所以更改类是无关紧要的

rai*_*7ow 5

对于fetchAll方法,如果未提供classname PDO::FETCH_CLASSTYPE且未引发flag,stdClass则返回一个对象(就像使用PDO::FETCH_OBJ).这就是发生的事情(lxr):

1436    switch(how & ~PDO_FETCH_FLAGS) {
1437    case PDO_FETCH_CLASS:
1438        switch(ZEND_NUM_ARGS()) {
1439        case 0:
1440        case 1:
1441            stmt->fetch.cls.ce = zend_standard_class_def;
1442            break
Run Code Online (Sandbox Code Playgroud)

然后,do_fetch由于没有提供类名,因此该值保持不变.这是有道理的,因为stdClass有时被认为是一种匿名类.)


这解释了你必须处理的代码; @ eggyal的回答解释了如何使用PDO::FETCH_CLASS || PDO::FETCH_CLASSTYPE组合.它实际上是一种非常强大的技术,允许您跳过工厂方法中的样板开关.