在PHP中,MySQL的结果是数组还是对象?

12 浏览
0 Comments

在PHP中,MySQL的结果是数组还是对象?

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

0
0 Comments

Mysql在PHP中的结果是数组还是对象?

在使用mysql_fetch_array时,代码难以阅读,维护起来很困难。你不能一眼看出你的对象正在处理什么数据。它稍微快一些,但如果这对你很重要,说明你处理的数据量可能很大,那么PHP可能不是正确的选择。

mysql_fetch_object有一些缺点,特别是如果你基于它构建一个数据库层。

- 列名可能不是有效的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){...}

尽管很多面向对象的粉丝(我也是面向对象的粉丝)喜欢将所有东西都转换成对象,但在我看来,关联数组比对象更好地模拟了数据库中的行,因为在我看来,对象是一组具有相应方法的属性,而行只是数据,应该简单地对待,无需更多的复杂性。

+1,这是关于这个主题的最佳答案。我过去使用关联数组,然后我转换为对象(试图使一切都成为对象),但基于你所说的理由,我又转换回关联数组;它看起来更像数据的数组。

但当你实际上将数据库结果表示为对象时怎么办?例如在活动记录模式中,如果前端已经使用对象接口,则我更喜欢$user = User::find(1),然后在前端如果已经实现为$user->email,就不需要进行更改。这样可以更灵活地允许从前端对结果调用方法。虽然将对象实现为实现ArrayAccess接口也很容易,使$user['email']对对象做与$user->email相同的事情。

使用魔术方法可以简单地使用数组来实现活动记录。你是对的,随着PHP越来越趋向于面向对象,mysql_fetch_*的具体实现正在在后台进行,因此无论使用哪种方法都是微不足道的。实际上,我开始思考这个问题的唯一原因是因为我正在将某人的过程性代码重写为面向对象的代码,而没有使用数据库抽象层。他们在整个代码中都使用了mysql_fetch_*函数,没有任何明显的模式。

这个回答对我来说很有道理,我实际上一直在考虑从mysql_fetch_object切换回mysql_fetch_assoc。当你开始从其他表中加入字段时,我发现mysql_fetch_object可能会变得非常混乱。但是,如果我可以问一个问题。我通常在我的对象类中有一些小的实用函数。例如,full_name()会返回$this->first_name . ' ' . $this->last_name。当切换到数组时,我失去了对这些方法的快速访问。你是如何解决这个问题的?

我没有写这个答案,只是进行了编辑。这是darkpenguin的答案,似乎是一个已删除的用户。(我会说忘记旧的mysql_东西,切换到PDO)

原文链接:https://stackoverflow.com/questions/60174

0
0 Comments

Mysql在PHP中的结果可以使用数组或对象进行处理。然而,需要注意的是,数组可以很容易地添加到内存缓存中(如eaccelerator,XCache等),而对象则不行(它们在存储时需要被序列化,每次检索时需要被反序列化)。

如果想要添加内存缓存支持,则可以考虑切换到使用数组而不是对象。然而,在这个时候,可能需要改变之前使用的对象类型返回值的大量代码。

0
0 Comments

Mysql在PHP中的结果可以以数组或对象的形式返回。性能上来说,使用哪种方式并不重要。区别在于mysql_fetch_object返回一个对象,mysql_fetch_assoc返回一个关联数组,mysql_fetch_array返回一个数组。根据个人偏好选择使用。在mysql_fetch_array的第二个参数中,可以指定返回关联数组、数字索引数组或两者都返回的结果。根据这篇文章中的介绍,在大型查询中应该使用mysql_fetch_assoc或mysql_fetch_array。

0