我遇到了一段代码,其中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一张记录表
那怎么能PDO::FETCH_CLASS知道什么是班级名字?我可以用类名添加列到我的记录中,FETCH_CLASS从数据库中获取类名吗?记录结构的例子将受到高度赞赏...... thx
*我正在测试这个类而不是作者,所以更改类是无关紧要的
对于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组合.它实际上是一种非常强大的技术,允许您跳过工厂方法中的样板开关.