我已经将我的编码逐步转换为OOP,感觉很棒。我还没有掌握的是,什么时候使用一个对象以及何时使用传统的阵列。
假设我有以下代码。在这里,我们创建一个包含人物的数组 - 电子邮件的接收者。它真的很可爱,但在阵列和物体之间往后跳跃感觉有点臭。
我的担忧是合法的还是这种良好做法?
public function receiver($email, $name = FALSE) {
$person = new Person();
$person->email = $email;
$person->name = $name;
$this->receiver[] = $person;
}
答案 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
循环等处理对象,如数组。