加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – PDO :: FETCH_CLASS,不传递类名作为参数

发布时间:2020-12-13 21:54:33 所属栏目:PHP教程 来源:网络整理
导读:我遇到了一段代码,其中调用了PDO :: FETCH_CLASS而没有将类的名称作为参数传递,如下所示: function getUsers() { $DBH = $this-getDbh(); $query = "SELECT * FROM users"; try { $STH = $DBH-query($query); $users = $STH-fetchAll(PDO::FETCH_CLASS); }
我遇到了一段代码,其中调用了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;
  }

现在,在官方documentation中它说:

If fetch_style includes PDO::FETCH_CLASSTYPE (e.g. PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE) then the name of the class is determined from a value of the first column.

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

> id:1
>姓名:乔希
>等等……

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

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

解决方法

对于fetchAll方法,如果未提供classname且未引发PDO :: FETCH_CLASSTYPE标志,则返回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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读