如何在PHP中以面向对象的方式传递数据?


11

我发现即使使用MVC框架(例如CodeIgniter),我也经常采用传递嵌套数组而不是对象的方法。

这不符合我对面向对象的理解。例如,如果我要将代码移植到Java,那么我就不会梦想像这样传递数组(或Vector,或其他任何东西)。

我想知道这是否是处理数据的适当方法。为什么有这样的原因在PHP中这样传递数组,或者为什么不使用对象呢?传递数据的最佳方法是什么?

Answers:


8

不要将Java的OO与PHP的混淆。Java是一种单一范例语言,这意味着它仅适用于OO。另一方面,PHP是一种多范式语言,您可以执行函数式编程或OO,也可以两者兼而有之。

现在不存在OO的“错误”实现。Java的OO不是所有其他语言都应该或必须遵循的明确实现。有一些明确的概念,并且两种语言都以自己的方式完全实现了它们(从一开始就是Java,从版本5开始就是PHP)。

因此,回答您的问题:CI所做的以及您在使用CI做的事情在PHP世界中都是正确的。PHP的数组是其最灵活,最有用的结构之一,当您的数据只是信息(不携带逻辑)时,在对象上使用数组实际上是一件好事。完整的OO代码与“仅OO代码”不同。

如果您从PHP入手,请使用Java作为良好OO实践的参考,但不要因为Java的不同而限制您对PHP的理解。您真的可以同时解决这两个问题,如果您不了解这些概念,那么范例将无法挽救您。

无论如何,如果您发现自己更喜欢Java(作为个人喜好)(请参考Ruby)来进行Web开发,它们之间的关系就更紧密了。


为什么不将Java OO与PHP OO混淆?它们几乎相同,除了PHP具有本机数组/哈希数据类型。
马丁·威克曼

实现非常相似。我指的是在两种语言中如何使用它们。
扬尼斯2011年

我在OOP中有问题。我想为一个对象(PHP基础)创建一个OOP设计,其中一个对象将依赖于其他对象。如何在PHP中处理此问题?请帮助我...
Imran Khan

示例场景:酒店对象具有Room对象,其中Room对象必须具有Date对象...,而Date对象具有针对人员类型的价格。现在,如何在OOP基础上用PHP处理这种情况(因为有大量数据需要在每个级别进行处理)。
伊姆兰·汗

@Walter我正在等待您的回复。
伊姆兰·汗

2

使用对象而不是数组只是因为它不是OO范式,而是个人喜好:)

对象可以在IDE中方便地完成代码,可以使用接口(类型提示)和继承。

如果您想使用对象而不是数组是因为看到了任何好处,请使用它们;但是,如果您只是因为对象而使用它们,则不要浪费时间进行重构:)


就像阵列一样使用对象会占用更多的内存和CPU。 ”(并非总是如此)。与数组保存相同数量数据的对象将占用几乎完全相同的内存量。
扬尼斯,2011年

@Yannis Rizos,是的,对象甚至可以使用更少的内存进行编辑。
OZ_

这不仅是因为他们可以使用更少的内存,还在于它们的内存使用无关紧要,因为与系统的其他内存性能方面以及使用对象的好处相比,这是微不足道的。如果我们非常在意内存的使用,我们将永远不会使用对象。我们关心的是对象为我们提供了更好的工具来推理和构建系统。
Rein Henrichs

@Rein Henrichs,我知道,谢谢。这就是为什么我的答案中所有关于“记忆”的词都被删除了的原因。我不是想做愚蠢的优化,但我确定objects just because they are objects这不是重构的理由:)阅读我的回答,不仅是评论。
OZ_

公平地说,我在编辑之前发表了评论。
莱恩·亨里希斯

1

您实际上并没有在OO系统中传递数据,而是传递了对象。区别在于对象既包含行为也包含数据。这就是为什么他们称其为面向对象而不是面向数据的原因。

只要您不需要数据的行为,那么普通的旧php数组与值对象一样好(或坏,取决于您的观点)。


0

我认为这只是一个调整问题-编程中有许多“对象”实现-Python和Javascript具有截然不同的属性。PHP OO可以说是一种技巧-PHP数组不是传统意义上的“对象”,但它们的作用显而易见。除非您希望数据具有自定义行为,否则为什么要使用对象?

编辑:

回复:不可变的价值对象

http://bradley-holt.com/2010/09/immutable-value-objects-in-php/


为数据提供可靠的结构。是的,我可以构建一个输出特定格式/数组嵌套的函数,但是我不会写另一个函数来对其稍加修改然后将其传递。
马修

1
确定-那么您将需要一个对象来保护变量访问-因为例如,没有与Python元组等效的PHP。但是,您就可以了-您已经定义了问题,您只需要使用该语言可用的结构即可...或只是学会忍受它的“怪癖”。我在我的初始文章中添加了一个链接,其中对该问题进行了有趣的讨论。
sunwukung 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.