gpt4 book ai didi

php - PDO::FETCH_CLASS 不将类名作为参数传递

转载 作者:可可西里 更新时间:2023-11-01 07:52:06 25 4
gpt4 key购买 nike

我遇到了一段代码,其中 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.

所以我不确定我是否理解它们的确切含义以及它是如何工作的。假设我有一个包含一条记录的 users

  • id:1
  • 姓名:乔希
  • 等等..

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

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

最佳答案

对于 fetchAll 方法,如果未提供类名并且未引发 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 组合。这实际上是一种非常强大的技术,允许您跳过工厂方法中的样板开关。

关于php - PDO::FETCH_CLASS 不将类名作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32458974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com