【问题标题】:Should I go for Arrays or Objects in PHP in a CouchDB/Ajax app?我应该在 CouchDB/Ajax 应用程序中使用 PHP 中的数组还是对象?
【发布时间】:2011-02-24 18:57:04
【问题描述】:

我发现自己在使用 couchDB 和 Ajax 的 PHP 应用程序中一直在数组和对象之间进行转换。当然,我也将对象转换为 JSON 并返回(有时用于 couchdb,但主要用于 Ajax),但这并没有太大干扰我的工作流程。

目前我有我使用的 CouchDB 模块返回的 php 对象,另一方面,我有返回数组的旧习惯,如 array("error"=>"not found","data"=> $dataObj) 来自我的函数。这会导致真正的 php 对象和嵌套数组混合出现,如果需要,我会使用 (object) 或 (array) 进行转换。最糟糕的是,我或多或少地知道函数返回什么,但不知道是什么类型(数组或对象),所以经常遇到类型错误。

我现在的计划是在从函数返回之前始终将数组转换为对象。当然,这意味着大量的重构。

这是正确的方法吗?转换开销呢?其他想法或提示?

编辑: Kenaniah 的回答建议我应该走另一条路,这意味着我会将所有内容都转换为数组。对于所有 Ajax / JSON 的东西以及 CouchDB,我会使用

$myarray = json_decode($json_data,$assoc = true); //EDIT: changed to true, whcih is what I really meant

更改所有 CouchDB 和 Ajax 函数需要做更多工作,但最后我有更好的代码。

【问题讨论】:

  • 是否可以以数组格式而不是对象格式返回您的 CouchDB 数据?结果对象实例化真的有必要吗?
  • 是的,我会这样做,但这需要大量重构。

标签: php ajax json couchdb type-conversion


【解决方案1】:

这取决于您要使用的范例。从根本上说,您的数据是存储在 CouchDB 中的所有键值对。也许它可以很容易地映射到对象/实体,并且根据具有属性和方法的对象来考虑它会更舒服。或者,也许不是,也许您更愿意在没有类提供的抽象的情况下处理原始数据。我认为这是您做出决定的关键区别。

在 PHP 中,对象与数组的开销并不大。在内部,它们被 PHP 引擎以类似方式处理。如果有问题,您可能想自己对其进行基准测试,但我认为除非您正在推动大量流量或拥有非常受限的服务器,否则您不会发现很多差异。显然,如果您在优化的 x86 汇编器中编写 Web 应用程序会更快,但您不这样做是因为您希望能够享受像 PHP 这样的高级语言提供的便利。所以现在执行最好的设计,然后在必要时进行优化。

【讨论】:

    【解决方案2】:

    一般来说,您应该始终使用数组,除非有充分的理由使用对象。在 PHP 中使用对象而不是数组的唯一充分理由是,如果您需要某种数组不提供的数据功能(例如私有/受保护变量、方法、对象魔法、定义的结构等)。如果您要严格处理数据,则数组格式会更好,因为您可以使用 PHP 的大量 array functions 数组轻松操作数据(没有双关语)。

    更新:

    如果您所做的只是在两点之间传递数据,那么数组更适合此目的。唯一的原因(据我所知)人们会使用数组上的对象作为数据的容器,是接收方是否需要有保证的格式(想想接口等)。

    据我所知,您应该从 CouchDB 返回数组以避免完全转换。

    【讨论】:

    • 如果我从一开始就知道这一点:o 我编辑了这个问题,如果没有人说服我相信别的东西,我会选择数组!很好的答案,谢谢! - karlthorwald (OP) - 又名
    • 对不起 Kenaniah,但这对我来说没有意义。虽然数组可能有很多实用函数,但这并不意味着您应该使用它们。如果您正在创建一个对象,那么它应该表现得像一个对象,而不是一个数组。例如,您不应该能够拆分对象,将其视为堆栈等:对象是具体的事物,例如用户或评论,而数组是具体事物的集合。如果你真的想像数组一样对待对象,总是有强制转换和 ArrayObject (php.net/arrayobject)。见鬼,你甚至可以对一个对象进行 foreach(),所以我看不出有什么好处。
    • 山姆,你完全忽略了我的意思。除非有理由您的数据应该作为对象输入,否则您应该默认为数组。一般来说,对象比数组有更大的开销。此外,它们绝不应仅用作数据容器(除非您需要遵守严格的约定,例如接口)。数组更适合这个目的。
    • 许多负责接管的开发人员,例如离职同事的 PHP 应用程序会争辩说所有开发人员都应该遵守严格的合同。
    • 不存在“纯粹的数据容器”,就像不存在没有盖子的盒子一样。您总是需要一种将数据输入和输出容器的方法。方法提供了一种一致的、受控的、可记录的方式来执行此操作。
    猜你喜欢
    • 2016-04-10
    • 2010-10-20
    • 1970-01-01
    • 2012-01-19
    • 2014-05-01
    • 2016-01-12
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多