db_fetch_array()与db_fetch_object()

fee*_*oop 6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 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在速度方面都是相同的,但前者产生的对象占用的内存比后者产生的数据略多.