为什么返回对象而不是数组?

Den*_*nis 83 php

我在WordPress中做了很多工作,我注意到有更多的函数返回对象而不是数组.除非您特别要求数组,否则数据库结果将作为对象返回.错误作为对象返回.在WordPress之外,大多数API都会为您提供一个对象而不是一个数组.

我的问题是,为什么他们使用对象而不是数组?在大多数情况下,它并不重要,但在某些情况下,我发现物体不仅难以加工而且能够缠绕我的头部.是否有使用对象的性能原因?

我是一名自学成才的PHP程序员.我有文科学位.如果我错过了计算机科学的一个基本方面,请原谅我.;)

Sas*_*ley 61

这些是我更喜欢一般物体的原因:

  • 对象不仅包含数据,还包含功能.
  • 对象具有(在大多数情况下)预定义的结构.这对API设计非常有用.此外,您可以将属性设置为public,protected或private.
  • 对象更适合面向对象的开发.
  • 在大多数IDE中,自动完成仅适用于对象.

这里有一些东西要读:

  • 第一个环节似乎不好?我的意思是它有效,但需要一个不同的aritcle (2认同)

Mat*_*ogt 24

在您从事大型软件项目多年之后,这可能不是您将要深入理解的内容.许多新的计算机科学专业的学生会给你一个答案,包括所有正确的单词(封装,数据功能和可维护性),但很少有人会真正理解为什么所有这些东西都很好.

我们来看几个例子吧.

  • 如果返回了数组,则需要预先计算所有值,或者需要返回许多小值,您可以使用这些值构建更复杂的值.

想想一个返回WordPress帖子列表的API方法.这些帖子都有作者,作者有姓名,电子邮件地址,甚至可能有他们的传记.

如果要返回数组中的所有帖子,则必须限制自己返回一组帖子ID:

[233, 41, 204, 111]

或返回一个看起来像这样的大型数组:

[ title: 'somePost', body: 'blah blah', 'author': ['name': 'billy', 'email': 'bill@bill.com', 'profile': ['interests': ['interest1', 'interest2', ...], 'bio': 'info...']] ]
[id: '2', .....]]
Run Code Online (Sandbox Code Playgroud)

返回ID列表的第一种情况对您没有多大帮助,因为您需要为每个ID进行API调用,以获取有关该帖子的一些信息.

第二种情况将提供比90%的时间更多的信息并且做更多的工作(特别是如果这些字段中的任何一个非常复杂的构建).

另一方面,对象可以让您访问所需的所有信息,但实际上还没有提取该信息.在使用对象时,可以懒惰地确定字段的值(即,当需要值时,而不是事先).

  • 阵列暴露出比预期更多的数据和功能

回到返回的大量数组的示例.现在有人可能会构建一个应用程序来迭代post数组中的每个值并打印它.如果更新API以向该post数组添加一个额外的元素,那么应用程序代码将会破坏,因为它将打印一些它可能不应该的新字段.如果API返回的post数组中的项目顺序发生更改,那么也会破坏应用程序代码.因此,返回一个数组会创建一个对象无法创建的各种可能的依赖项.

  • 功能

对象可以在其中保存信息,以便为您提供有用的功能.例如,post对象可以足够聪明以返回上一个或下一个帖子.阵列无法为您做到这一点.

  • 灵活性

上述对象的所有好处有助于创建更灵活的系统.


tak*_*hin 10

我的问题是,为什么他们使用对象而不是数组?

可能有两个原因:

  • WordPress很老了
  • 在大多数情况下,数组更快,占用的内存更少
  • 更容易序列化

是否有使用对象的性能原因?

不,但还有很多其他好的原因,例如:

  • 你可以在对象中存储逻辑(方法,闭包等)
  • 您可以使用界面强制对象结构
  • IDE中更好的自动完成功能
  • 你没有得到未定义的数组键的通知
  • 最后,您可以轻松地将任何对象转换为数组

OOP!= AOP :)

(例如,在Ruby中,一切都是对象.以前PHP是程序/脚本语言.)


小智 7

WordPress(和相当数量的其他PHP应用程序)使用对象而不是数组,出于概念而非技术原因.

一个对象(即使只是stdClass的一个实例)是一个事物的表示.在WordPress中可能是帖子,评论或用户.另一方面,数组是一组东西.(例如,帖子列表.)

从历史上看,PHP没有很好的对象支持,因此数组在早期就变得非常强大.(例如,具有任意键而不仅仅是零索引的能力.)利用PHP 5中提供的对象支持,开发人员现在可以选择使用数组或对象作为键值存储.就个人而言,我更喜欢WordPress方法,因为我喜欢对象和数组提供的"实体"和"集合"之间的语法差异.


Ita*_*vka 5

  1. 这样代码看起来更酷
  2. 对象通过引用传递
  3. 对象比数组具有更强的类型,因此容易出错(或者当您尝试使用不存在的成员时给您一个有意义的错误消息)
  4. 当今所有 IDE 都具有自动完成功能,因此在处理定义的对象时,IDE 可以为您做很多事情并加快速度
  5. 轻松地将逻辑数据封装在同一个盒子中,使用数组时,您可以将数据存储在数组中,然后使用一组不同的函数来处理它。
  6. 继承,如果您有一个类似的数组,其功能几乎但不相似,那么如果您要使用对象来执行此操作,则必须复制更多代码

可能还有一些我考虑过的原因


Geo*_*ins 5

返回对象有几个原因:

  1. 写作$myObject->property需要的“开销”字符比$myArray['element']

  2. 对象可以返回数据和功能;数组只能包含数据。

  3. 启用链接:$myobject->getData()->parseData()->toXML();

  4. 更轻松的编码:IDE 自动完成功能可以为对象提供方法和属性提示。

就性能而言,数组通常比对象更快。除了性能之外,使用数组还有几个原因:

  1. array_*() 系列函数提供的功能可以减少某些情况下所需的编码量。

  2. 可以对数组执行诸如 count() 和 foreach() 之类的操作。对象不提供此功能(除非它们实现IteratorCountable)。


hak*_*kre 5

我的问题是,为什么他们(Wordpress)使用对象而不是数组?

这真是一个很好的问题而且不容易回答.我只能假设在Wordpress中使用stdClass对象很常见,因为它们使用的数据库类默认将记录作为stdClass对象返回.他们已经习惯了(8年甚至更长时间)就是这样.我不认为这个简单的事实背后有更多的想法.

关联数组的句法糖 - Zeev Suraski 关于自PHP 3以来的标准对象

  • stdClass对象并不比数组好.他们几乎是一样的.这是由于语言的一些历史原因以及stdClass对象实际上是有限的,实际上只是一种非常基本意义上的价值对象.
  • stdClass对象存储其成员的值,如每个条目的数组.就是这样.
  • 只有PHP怪胎能够stdClass使用私有成员创建对象.没有太大的好处 - 如果有的话 - 这样做.
  • stdClass对象没有任何方法/功能.所以在Wordpress中没有使用它.
  • 与之相比array,处理列表或半结构化数据的功能要少得多.

但是,如果您习惯于数组,那么只需转换:

$array = (array) $object;
Run Code Online (Sandbox Code Playgroud)

并且您可以作为数组访问以前作为对象的数据.或者你喜欢它反过来:

$object = (object) $array;
Run Code Online (Sandbox Code Playgroud)

这只会删除无效的成员名称,例如数字.所以要小心一点.但是我认为你得到了全局:只要它是关于数组和对象的,就没有太大区别stdClass.

有关:


sim*_*aun 2

通常不会是因为性能原因。通常,对象的成本高于数组。

对于许多 API,它可能与提供存储机制之外的其他功能的对象有关。否则,这是一个偏好问题,返回对象与返回数组实际上没有任何好处。