这有点取决于你想要什么。由于您的类型只是属性对象,我认为Vahe Shadunts的解决方案是最轻量级和最简单的。
如果您想在 PHP 中获得更多控制权,您需要使用 getter 和 setter。这将允许您使其工作更具体。
就foreach
Docs而言,您的孩子对象需要做的就是实现Iterator
orIteratorAggregate
接口,然后可以在内部使用它foreach
(参见Object Iteration Docs)。
这是一个例子:
$jane = ConcretePerson::build('Jane', 'Lovelock');
$janesChildren = $jane->getChildren();
$janesChildren->attachPerson(ConcretePerson::build('Clara'));
$janesChildren->attachPerson(ConcretePerson::build('Alexis'));
$janesChildren->attachPerson(ConcretePerson::build('Peter'));
$janesChildren->attachPerson(ConcretePerson::build('Shanti'));
printf(
"%s %s has the following children (%d):\n",
$jane->getFirstname(),
$jane->getLastname(),
count($jane->getChildren())
);
foreach($janesChildren as $oneOfJanesChildren)
{
echo ' - ', $oneOfJanesChildren->getFirstname(), "\n";
}
输出:
Jane Lovelock has the following children (4):
- Clara
- Alexis
- Peter
- Shanti
如果您需要更多功能(例如随着时间的推移),这些在后台工作的命名接口和对象(我在最后链接代码)与数组和属性相比具有一定的优势。
假设 Jane 和 Janet 结婚了,所以他们都拥有相同的孩子,所以都分享他们:
$janet = ConcretePerson::build('Janet', 'Peach');
$janet->setChildren($janesChildren);
现在珍妮特有了一个新孩子:
$janet->getChildren()->attachPerson(ConcretePerson::build('Feli'));
Jane 也是如此,因为它们共享相同的子对象。
然而 PHP 对这些类型化的集合并不强大,因此你有相当多的样板代码来完成这项工作。
代码要点