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']。
这两种方法有什么区别?它们完全可以互换吗?
答案 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
相同,但前者产生的对象占用的内存比后者产生的数据略多。