我在WordPress中做了很多工作,我注意到有更多的函数返回对象而不是数组.除非您特别要求数组,否则数据库结果将作为对象返回.错误作为对象返回.在WordPress之外,大多数API都会为您提供一个对象而不是一个数组.
我的问题是,为什么他们使用对象而不是数组?在大多数情况下,它并不重要,但在某些情况下,我发现物体不仅难以加工而且能够缠绕我的头部.是否有使用对象的性能原因?
我是一名自学成才的PHP程序员.我有文科学位.如果我错过了计算机科学的一个基本方面,请原谅我.;)
Sas*_*ley 61
这些是我更喜欢一般物体的原因:
这里有一些东西要读:
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对象可以足够聪明以返回上一个或下一个帖子.阵列无法为您做到这一点.
上述对象的所有好处有助于创建更灵活的系统.
小智 7
WordPress(和相当数量的其他PHP应用程序)使用对象而不是数组,出于概念而非技术原因.
一个对象(即使只是stdClass的一个实例)是一个事物的表示.在WordPress中可能是帖子,评论或用户.另一方面,数组是一组东西.(例如,帖子列表.)
从历史上看,PHP没有很好的对象支持,因此数组在早期就变得非常强大.(例如,具有任意键而不仅仅是零索引的能力.)利用PHP 5中提供的对象支持,开发人员现在可以选择使用数组或对象作为键值存储.就个人而言,我更喜欢WordPress方法,因为我喜欢对象和数组提供的"实体"和"集合"之间的语法差异.
可能还有一些我考虑过的原因
返回对象有几个原因:
写作$myObject->property
需要的“开销”字符比$myArray['element']
对象可以返回数据和功能;数组只能包含数据。
启用链接:$myobject->getData()->parseData()->toXML();
更轻松的编码:IDE 自动完成功能可以为对象提供方法和属性提示。
就性能而言,数组通常比对象更快。除了性能之外,使用数组还有几个原因:
array_*() 系列函数提供的功能可以减少某些情况下所需的编码量。
可以对数组执行诸如 count() 和 foreach() 之类的操作。对象不提供此功能(除非它们实现Iterator或Countable)。
我的问题是,为什么他们(Wordpress)使用对象而不是数组?
这真是一个很好的问题而且不容易回答.我只能假设在Wordpress中使用stdClass
对象很常见,因为它们使用的数据库类默认将记录作为stdClass
对象返回.他们已经习惯了(8年甚至更长时间)就是这样.我不认为这个简单的事实背后有更多的想法.
stdClass
对象并不比数组好.他们几乎是一样的.这是由于语言的一些历史原因以及stdClass
对象实际上是有限的,实际上只是一种非常基本意义上的价值对象.stdClass
对象存储其成员的值,如每个条目的数组.就是这样.stdClass
使用私有成员创建对象.没有太大的好处 - 如果有的话 - 这样做.stdClass
对象没有任何方法/功能.所以在Wordpress中没有使用它.array
,处理列表或半结构化数据的功能要少得多.但是,如果您习惯于数组,那么只需转换:
$array = (array) $object;
Run Code Online (Sandbox Code Playgroud)
并且您可以作为数组访问以前作为对象的数据.或者你喜欢它反过来:
$object = (object) $array;
Run Code Online (Sandbox Code Playgroud)
这只会删除无效的成员名称,例如数字.所以要小心一点.但是我认为你得到了全局:只要它是关于数组和对象的,就没有太大区别stdClass
.
有关:
通常不会是因为性能原因。通常,对象的成本高于数组。
对于许多 API,它可能与提供存储机制之外的其他功能的对象有关。否则,这是一个偏好问题,返回对象与返回数组实际上没有任何好处。
归档时间: |
|
查看次数: |
15180 次 |
最近记录: |