使用对象而不是数组的PHP

4

当我开始学习面向对象编程时,我读到了“一切皆为对象”。在大多数情况下,我使用PHP进行开发。在这里,数组起着重要的作用。在像C#这样的语言中,你真的需要使用和传递对象而不是数组。

例如:

Class Product
{
    private $data = array();

    public function __construct()
    {
        $this->data['setting_1'] = 'a';
        $this->data['setting_2'] = 'b';
        $this->data['setting_3'] = 'c';
        $this->data['setting_4'] = 'd';
        $this->data['setting_5'] = 'e';

    }
}

在使用PHP时,为每个东西都创建类是否有意义呢?例如:
Class Product
{
    private $setting_1, $setting_2,  $setting_3,  $setting_4,  $setting_5; 
}

在另一个类(例如模型)中实例化Product类,然后返回对象而不是数组(例如给控制器使用)?

4个回答

4
答案很简单。
“一切都是对象”只是一个理想状态。
在大多数真实的面向对象编程语言中,也有简单的数据类型,比如Java或CSharp。在PHP中,甚至有一个复杂的非对象数据类型:数组。您不必担心在面向对象编程上使用它。
需要注意的是,拥有强大的数组数据类型更多的是优势而不是劣势。在我看来,PHP最缺乏的面向对象编程特性是多态性。
然而,PHP5引入了一组迭代器数据结构,位于所谓的标准PHP库(SPL)扩展中,它是PHP核心发行版的一部分。您可以查看它们,但在大多数情况下,数组数据类型应该运行良好(且性能高)。

3

不是所有的东西都需要放在一个类里面。这不是Java。:P

PHP是一种多范式语言。这意味着可以完全合法地使用一些面向对象,而不必全部采用。面向对象编程偏执者可能会告诉你,你是多么可怕的人,但是只有当它降低整体复杂性时,面向对象编程才是值得的。为了做而做,将每个值都封装在一个类中,对于真正的收益而言只会增加复杂性。

类基本上是具有自己独特行为的数据模板。如果您的数据不需要与之相关的行为(例如特殊构建、验证、解释或持久性),那么将其封装在对象中通常是过度的。


面向对象编程只有在减少总体复杂性时才是值得的。一个面向对象编程专家证实了这一点 :) +1 .. 当然,除了“复杂性”之外,还有其他使用面向对象编程风格的原因,比如“灵活性”,“可重用性”... - hek2mgl
@hek2mgl:灵活性和可重用性通常确实会减少总体复杂性。 :) 但是在它们无法做到的地方,它们实际上可能会成为一种阻碍。我相信我们几乎所有人都曾经以无限的灵活性和可重用性为目标编写过一些东西,最终因此而变得非常混乱。有很多值得说的是,现在让它工作起来,等到你发现需要时再添加普遍性。 - cHao

2
回答“在使用PHP时为每个东西创建类是否有意义?”的问题,可以改为“在使用PHP时为每个东西创建类属性是否有意义?”
是的,如果只使用数组,那么在开发其他人的代码时会非常困难。特别是如果没有常量,很可能会因为输入错误而导致难以找到的错误。
此外,我基于属性与值列表(数组)之间的比较来回答这个问题,而不是关于“为每个东西创建对象”的讨论。

2
在“一切皆为对象”的思维模式下,请记住这适用于从一开始就是面向对象的语言。PHP不是其中之一,对象是事后添加的。因此,在PHP中,您的简单变量类型不是对象,它们是更小且更简单的内存片段。
这可能有些微不足道,但如果您不需要在PHP中使用对象,则不要使用简单数组比包含数组的对象更轻。通过更轻,我是指它们使用更少的RAM,并且反过来,运行速度略快。
关于编写PHP的最好建议是KISS(保持简单愚蠢)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接