PHP:在OOP中追加对象?

时间:2011-02-24 21:07:06

标签: php oop

我已经将我的编码逐步转换为OOP,感觉很棒。我还没有掌握的是,什么时候使用一个对象以及何时使用传统的阵列。

假设我有以下代码。在这里,我们创建一个包含人物的数组 - 电子邮件的接收者。它真的很可爱,但在阵列和物体之间往后跳跃感觉有点臭。

我的担忧是合法的还是这种良好做法?

public function receiver($email, $name = FALSE) {

    $person = new Person();
    $person->email = $email;
    $person->name = $name;

    $this->receiver[] = $person;
}

4 个答案:

答案 0 :(得分:3)

要回答您的确切问题,是的,使用数组很好。您可以使用类似SplObjectStorage的内容,但对于大多数用例,数组非常好...

我会这样做。我没有在方法中创建对象,而是将对象传递给:

public function receiver(Person $person) {
    $this->receiver[] = $person;
}

然后致电:

$person = new Person();
$person->email = 'email@example.com';
$obj->receiver($person);

这样,你就可以将Person对象的实现与当前对象(无论是什么)分离。更好的方法是声明一个接口,具体取决于您对该用法的预期效果,并要求实现该接口:

interface iEmailable {
    public function getName();
    public function getEmail();
}
class Person implements iEmailable {
    protected $name = '';
    protected $email = '';
    public function __construct($name, $email) {
        $this->name = $name;
        $this->email = $email;
    }
    public function getName() {
        return $this->name;
    }
    public function getEmail() {
        return $this->email;
    }
}

然后,将您的方法调整为:

public function receiver(iEmailable $person) {
    $this->receiver[] = $person;
}

现在,你与具体的Person类脱钩了。任何类都可以自由传递,只要它实现了正确的接口......

答案 1 :(得分:1)

这绝对没问题,OOP并不排除在适当的地方使用数组。

答案 2 :(得分:1)

实际上,经常发现数组隐藏在OOP对象中。类/对象的目标是描述某些东西的属性。如果那个东西需要存储多个相同类型的值,那么那里总会有一个数组。

例如,描述汽车/汽车的类可能有一个存储座位的数组。

答案 3 :(得分:0)

数组没有错误,如果您有这个想法,那么您可能会“过度客观化”您的代码。有些事情对于创建对象没有意义。

在您的示例中,您的对象看起来像是一个名为receiver的属性,以及一个名为receiver的方法。这不是最好的做法......保持你的方法和属性名称不同。

对于数组和对象等等,请查看Iterator(click for docs)界面。这允许您在foreach循环等处理对象,如数组。