我在WordPress中做了很多工作,而且我注意到返回数组的函数要多于数组。除非您特别要求一个数组,否则数据库结果将作为对象返回。错误作为对象返回。在WordPress之外,大多数API都会为您提供一个对象而不是数组。
我的问题是,为什么他们使用对象而不是数组?在大多数情况下,它并不重要,但是在某些情况下,我发现对象不仅难以处理,而且难以缠住。使用对象有性能上的原因吗?
我是一个自学成才的PHP程序员。我拥有文科学位。如果我错过了计算机科学的一个基本方面,请原谅我。;)
我在WordPress中做了很多工作,而且我注意到返回数组的函数要多于数组。除非您特别要求一个数组,否则数据库结果将作为对象返回。错误作为对象返回。在WordPress之外,大多数API都会为您提供一个对象而不是数组。
我的问题是,为什么他们使用对象而不是数组?在大多数情况下,它并不重要,但是在某些情况下,我发现对象不仅难以处理,而且难以缠住。使用对象有性能上的原因吗?
我是一个自学成才的PHP程序员。我拥有文科学位。如果我错过了计算机科学的一个基本方面,请原谅我。;)
count()一个对象。
stdClass)大致相同。除了“因为主要在OOP中工作的程序员喜欢使用对象的语义”之外,我不确定该问题是否有答案
Answers:
这些就是为什么我通常更喜欢对象的原因:
这是要阅读的内容:
在您从事大型软件项目数年之前,这可能不是您要深入理解的东西。许多计算机科学专业的新人都会用正确的词(封装,数据功能和可维护性)为您提供答案,但是很少有人真正理解为什么所有这些东西都很好。
让我们来看几个例子。
考虑一个返回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', .....]]
返回ID列表的第一种情况对您不是很有帮助,因为然后您需要为每个ID进行API调用,以获取有关该帖子的一些信息。
第二种情况将比您需要的时间多提供90%的信息,并且会做更多的工作(特别是如果其中任何一个字段的构建非常复杂)。
另一方面,对象可以为您提供所需的所有信息的访问权限,但尚未实际提取该信息。使用对象时,可以懒惰地确定字段的值(即,需要该值时而不是事先确定)。
回到返回大型数组的示例。现在,可能有人会构建一个应用程序,该应用程序迭代post数组中的每个值并打印出来。如果将API更新为仅向该post数组添加一个额外的元素,则应用程序代码将中断,因为它将打印一些可能不应该的新字段。如果API返回的post数组中的项目顺序发生变化,这也会破坏应用程序代码。因此,返回数组会创建对象可能不会创建的各种可能的依赖关系。
对象可以在其中保存信息,从而可以为您提供有用的功能。例如,发布对象可能足够聪明,可以返回上一个或下一个发布。数组永远无法为您做到这一点。
上面提到的对象的所有优点都有助于创建更灵活的系统。
我的问题是,为什么它们(Wordpress)使用对象而不是数组?
这确实是一个好问题,不容易回答。我只能假定使用stdClass对象在Wordpress中很常见,因为它们使用的是数据库类,默认情况下,该类将记录作为stdClass对象返回。他们已经习惯了(8年或更长时间),仅此而已。我认为这个简单的事实背后没有更多的想法。
语法糖关联数组 -泽弗·苏拉斯凯 关于标准对象因为PHP 3
stdClass对象并不是真的比数组更好。它们几乎相同。这是由于语言的某些历史原因,而且stdClass对象实际上是有限的,实际上只是非常基本意义上的某种价值对象。stdClass对象存储其成员的值,就像每个条目的数组一样。就是这样。stdClass使用私有成员创建对象。这样做没有太大的好处-如果有的话。stdClass对象没有任何方法/功能。因此,请勿在Wordpress中使用它。array,处理列表或半结构化数据的有用功能要少得多。但是,如果您习惯使用数组,则只需进行以下转换即可:
$array = (array) $object;
您可以访问以前作为对象的数据(作为数组)。或者您也喜欢它:
$object = (object) $array;
这只会删除无效的成员名称,例如数字。因此请多加注意。但是我认为您可以了解一下:只要有关于的数组和对象,就没有太大的区别stdClass。
有关:
我可能还想过一些其他原因
对象比数组强大得多。每个对象都可以作为一个类的实例附加功能。如果您有需要处理的数据,那么您需要一个函数来进行处理。使用数组时,您将必须在该数组上调用该函数,并因此将逻辑自身与数据相关联。有了对象,此关联已经完成,您不必再在意它了。
您还应该考虑信息隐藏的面向对象原则。并非从数据库返回或进入数据库的所有内容都应直接访问。
StdClass。这些对象与您突出显示的内容没有任何共同之处。例如,它们没有功能,也没有继承。对于Wordpress,所有类变量都是公共的。
stdClass从ca开始,该类默认情况下返回对象。8年。如果要获取数组,则需要设置一个可选参数来获取它。
返回对象的原因有几个:
写作$myObject->property所需的“开销”字符少于$myArray['element']
对象可以返回数据和功能;数组只能包含数据。
启用链接: $myobject->getData()->parseData()->toXML();
简化编码:IDE自动补全功能可以为对象提供方法和属性提示。
在性能方面,数组通常比对象快。除了性能之外,还有几个使用数组的原因:
通常不会因为性能原因。通常,对象的成本高于数组。
对于许多API,它可能与提供存储功能以外的其他功能的对象有关。否则,这是一个优先事项,并且返回对象与数组相比并没有任何好处。
数组只是值的索引。而对象包含可以为您生成结果的方法。当然,有时候您可以直接访问对象的值,但是“正确的方法”是访问对象的方法(对那个对象的值进行操作的函数)。
$obj = new MyObject;
$obj->getName(); // this calls a method (function), so it can decide what to return based on conditions or other criteria
$array['name']; // this is just the string "name". there is no logic to it.
有时您直接访问对象变量,这通常是令人讨厌的,但是它仍然经常发生。
$obj->name; // accessing the string "name" ... not really different from an array in this case.
但是,请考虑MyObject类没有名为“ name”的变量,而是具有first_name和last_name变量。
$obj->getName(); // this would return first_name and last_name joined.
$obj->name; // would fail...
$obj->first_name;
$obj->last_name; // would be accessing the variables of that object directly.
这是一个非常简单的示例,但是您可以看到进展情况。一个类提供了变量和函数的集合,这些变量和函数可以对一个独立的逻辑实体中的所有变量进行操作。该实体的实例称为对象,它引入了逻辑和动态结果,而数组根本没有这种结果。
在大多数情况下,对象的速度与数组一样快,甚至比数组还快,但在PHP中并没有明显的区别。主要原因是对象比数组更强大。面向对象的编程允许您创建对象并不仅存储数据,还存储其中的功能,例如,在PHP中,MySQLi类允许您拥有一个数据库对象,您可以使用大量内置函数(而不是过程方法)来操纵该数据库对象。
因此,主要原因是OOP是一个很好的范例。我写了一篇关于为什么使用OOP是个好主意的文章,并解释了这个概念,您可以在这里看看: http //tomsbigbox.com/an-introduction-to-oop/
作为未成年人,您还可以键入更少的内容来从对象获取数据-$ test-> data比$ test ['data']更好。
我不熟悉文字印刷机。这里有许多答案表明,对象的强项就是能够包含功能代码。从函数/ API调用返回对象时,它不应包含实用程序函数。只是属性。
返回对象的优势在于,API背后的任何内容都可以更改而不会破坏您的代码。
示例:您将获得一个包含键/值对的数据数组,键代表DB列。如果数据库列被重命名,您的代码将中断。
我在php 5.3.10(windows)中运行下一个测试:
for ($i = 0; $i < 1000000; $i++) {
$x = array();
$x['a'] = 'a';
$x['b'] = 'b';
}
和
for ($i = 0; $i < 1000000; $i++) {
$x = new stdClass;
$x->a = 'a';
$x->b = 'b';
}
复制自 http://atomized.org/2009/02/really-damn-slow-a-look-at-php-objects/comment-page-1/#comment-186961
为10个并发用户调用该函数10次(以获取平均值),然后
再次,对象它仍然痛苦缓慢。OOP使事情保持整洁,但是应谨慎使用。
Wordpress正在应用什么?嗯,这两种解决方案都使用对象,数组和对象与数组,而wpdb类则使用后者(这是Wordpress的核心)。
尽管关于对象不仅仅是数据的观点是有效的,因为它们通常是数据和行为,但在Martin Fowler的“企业应用程序体系结构模式”中至少提到了一种模式,该模式 适用于您要转移的这种情况来自一个系统(API背后的应用程序)和另一个系统(您的应用程序)的数据。
它的数据传输对象-在进程之间携带数据以减少方法调用数量的对象。
因此,如果问题是API应该返回DTO还是数组,我会说,如果性能成本可以忽略不计,那么您应该选择更可维护的选项,我认为这是DTO选项...但是当然您也可以必须考虑正在开发系统的团队的技能和文化,以及每种选项的语言或IDE支持。
count()或array_*()在对象上发挥作用(至少在存储/返回键=>值数据方面),我对此感到好奇。似乎没有人提起它,还是我错过了什么?