db_fetch_array()与db_fetch_object()

时间:2010-08-17 20:39:45

标签: drupal

Drupal提供了这两种方法来迭代db_query()结果。例如,

$users = array();
$result = db_query('SELECT uid FROM {users} WHERE status=0 AND login=0');
while ($row = db_fetch_object($result)) {
    $users[] = $row->uid;
}

然而,似乎db_fetch_array($ result)在这里可以使用相同的,只在下一行使用$ row ['uid']。

这两种方法有什么区别?它们完全可以互换吗?

来源:http://api.drupal.org/api/group/database/6

1 个答案:

答案 0 :(得分:12)

不同之处在于db_fetch_array()返回一个数组,而db_fetch_object()返回一个对象。根据用例,您可能需要一个或另一个。

看来,至少考虑到你提供的代码片段,它们确实会像你提到的那样改变语法 - 可以与你的用例互换。

修改

Drupal的db_fetch_object()db_fetch_array()继承自PHP的*_fetch_object*_fetch_array:Drupal只是抽象PHP的数据库特定版本,因此Drupal开发人员不必关心什么数据库在后端使用。

因此,它们在PHP中存在的原因相同,这与它们在Drupal中存在的原因相同。它们为开发人员提供了灵活性:一些用例需要数组,一些需要对象。

在Drupal核心中,db_fetch_object()的优势远远超过db_fetch_array():您可以通过转到每个函数的API页面并单击标题 n函数调用来查看核心内部的使用方式functionname

这种偏向db_fetch_object的原因主要是偏好和易于维护:说$object->property的字符少于说$object['property']的字符。 Drupal中的许多代码风格都基于多年的惯例。

您可以使用其中任何一种,但从语义上考虑是否有意义将数据作为对象或数组。例如,如果您想利用PHP过多的数组函数(例如array_merge(),它没有简单的对象模拟),您可以选择降低约定并使用db_fetch_array()

在所有条件相同的情况下,*_fetch_object()在速度方面与*_fetch_array相同,但前者产生的对象占用的内存比后者产生的数据略多。