MySQL导致PHP-数组或者对象?

时间:2020-03-06 14:37:52  来源:igfitidea点击:

现在已经使用PHP / MySQL了一段时间,我想知道使用mysql_fetch_object()与mysql_fetch_assoc()/ mysql_fetch_array()是否有任何特定的优势(性能或者其他)。

解决方案

使用mysql_fetch_array()获取数组可以让我们通过foreach循环或者for循环遍历结果集。 for循环不能遍历mysql_fetch_object()。

不知道这是否重要,只是以为我会提到它。

我认为所有这些功能之间的差异都是微不足道的,尤其是与代码可读性相比。

如果我们担心这种优化,请使用" mysql_fetch_row()"。这是最快的,因为它不使用关联数组(例如$ row [2]),但是最容易用它破坏代码。

while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

...就是我一直以来所做的。我更喜欢使用对象而不是数组来收集数据,因为它可以更好地组织数据,而且我知道尝试向对象添加任意属性的可能性比尝试添加索引的可能性小数组(在我使用PHP的最初几年中,我认为我们不能只是将任意属性分配给对象,因此,根深蒂固不这样做)。

性能方面,使用什么都无所谓。区别在于mysql_fetch_object返回对象:

while ($row = mysql_fetch_object($result)) {
    echo $row->user_id;
    echo $row->fullname;
}

mysql_fetch_assoc()返回关联数组:

while ($row = mysql_fetch_assoc($result)) {
    echo $row["userid"];
    echo $row["fullname"];
}

和mysql_fetch_array()返回数组:

while ($row = mysql_fetch_array($result)) {
    echo $row[0];
    echo $row[1] ;
}

在速度上," mysql_fetch_object()"与" mysql_fetch_array()"相同,几乎与" mysql_fetch_row()"一样快。

同样,使用mysql_fetch_object(),我们将只能通过相应的字段名称访问字段数据。

我投票反对mysql_fetch_array()

因为我们同时获得了用数字索引的列和列名,所以这将创建一个两倍大的数组。如果我们不需要调试代码并查看其内容,那就很好。但是对于我们其他人来说,调试起来变得更加困难,因为我们必须以奇怪的格式遍历两倍的数据。

有时我会遇到一个使用此功能的项目,然后在调试时,我认为出了一些问题,因为我的数据中混入了数字列。

因此,以理智的名义,请不要使用此功能,这会使代码维护更加困难

注意事项:数组可以轻松地添加到内存缓存中(eaccelerator,XCache等),而对象则不能(在存储时需要序列化,并且每次检索都必须不序列化!)。

当我们想添加内存缓存支持时,可以切换为使用数组而不是对象,但是到那时,我们可能已经必须更改许多代码,这些代码使用以前使用的对象类型返回值。

mysql_fetch_array使代码难以阅读=维护噩梦。我们无法一目了然地看到对象正在处理什么数据。它的速度稍快一些,但是如果这对我们很重要,则我们正在处理大量数据,以至于PHP可能不是正确的选择。

mysql_fetch_object具有一些缺点,特别是如果我们在其上基于db层。

  • 如果数据库驱动程序为我们提供了查询中指定的列名,则列名可能不是有效的PHP标识符,例如" tax-allowance"或者" user.id"。然后,我们必须在各处开始使用" {}"。
  • 如果要基于列的名称获取列,并将其添加到变量中,则还必须开始使用变量属性$ row-> {$ column_name},而数组语法为$ row [$ column_name]。
  • 如果我们指定类名,则构造函数不会被调用。
  • 如果我们不指定类名,则会得到一个stdClass,无论如何它都不比数组好。

mysql_fetch_assoc是这三个中最容易使用的,我喜欢这在对象和数据库结果行之间的代码区别。

$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}

尽管许多OOP爱好者(而且我是OOP爱好者)喜欢将一切都变成对象的想法,但我觉得关联数组比数据库对象更适合行中的模型,因为在我看来,对象是具有作用于它们的方法的一组属性,而该行仅是数据,因此应这样对待,而不会造成进一步的复杂化。