我来自Java背景,最近才开始学习PHP和CodeIgniter。
虽然我发现该框架的清晰设计和令人印象深刻的文档非常棒,但我注意到框架并不一定阻止使用数据数组而不是值对象来传递数据。例如,数据库查询将结果返回到一个数组中,然后您可以将该数组传递给视图进行渲染。类似地,大多数核心库方法将关联数组作为输入。
对我来说,对于面向对象的语言来说,这似乎是一个糟糕的设计,它应该促进甚至强制使用值对象来实现封装的明显好处。
这真的是一个糟糕设计的例子,还是仅仅是风格/偏好的问题?通过更多OO方法使用数组数据有什么明显的好处吗?
答案 0 :(得分:8)
不要误以为“一切都必须成为对象”的神话让你的代码成为“良好的面向对象设计”。当你开始尝试制定“我不应该被允许这样做的理性化,因为它不是好的OOP”时,你就是在向后编程。
如果需要数据列表,数据数组就足够了。实际上,这是适当的。
答案 1 :(得分:2)
为什么在哈希做的时候构建一个复杂的对象结构?恕我直言,java世界中的许多东西都是过度设计的。这种观点似乎与许多动态语言和工具集共享,例如Ruby on Rails。
答案 2 :(得分:2)
数组是一个对象,完全有效用于传递数据。当内置的类不需要定义自己的类时。
答案 3 :(得分:2)
PHP不是面向对象的语言。这是一种混合语言。
阵列在任何地方都使用,因为它们比其他语言(特别是Java)强大得多。在幕后,数组和对象在PHP中使用相同的字典实现。
如果你想对数组进行客观化,那么将它们包装成:
$array = new ArrayObject($array, ArrayObject::ARRAY_AS_PROPS);
或者您可以将数组1:1类型转换为值对象:
$obj = (object) $array;
然后回来:
$array = (array) $obj;
无论如何,它们在很多情况下都是相似的(foreach
对它们很容易)。
答案 4 :(得分:1)
嗯,使用值对象而不是关联数组的一个明显原因是,如果你在一个数组中传递数据,然后你必须更改数据库表列的名称,你将不得不更新代码中到处访问它的方式,而如果你有一个值对象,则只需更新一行(在VO构造函数内)