图片我想要一个对象$ parent;
例如:
$parent->firstname = "Firstname";
$parent->lastname = "Lastname";
$parent->children = ???
- >然后,这必须是对象的集合,以便稍后我可以这样做:
foreach ($parent->children as $child) {
$child->firstname
$child->lastname
}
这可能吗?
答案 0 :(得分:0)
是的,例如,如果你让孩子成为array
。
这只是一个例子,这不是最佳解决方案:
class person
{
public $firstname = 'Jane';
public $lastname = 'Doe';
public $children = array();
}
$parent = new person();
$parent->firstname = "Firstname";
$parent->lastname = "Lastname";
//1st child
$child = new person();
$child->firstname = 'aa';
$parent->children[] = $child;
//2nd child
$child = new person();
$child->firstname = 'bb';
$parent->children[] = $child;
foreach ($parent->children as $child) {
...
}
答案 1 :(得分:0)
这取决于你想要什么。由于您的类型只是属性对象,我认为Vahe Shadunts的解决方案最轻量级且最简单。
如果你想在PHP中获得更多控制权,你需要使用getter和setter。这将使您的工作更加具体。
就foreach
Docs而言,您的所有子对象需要做的是实现Iterator
或IteratorAggregate
接口,然后可以在foreach
内使用(见Object IterationDocs)。
以下是一个例子:
$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
如果您需要更多功能(例如,随着时间的推移),这些在后台工作的命名接口和对象(我在最后链接代码)与数组和属性相比具有一定的优势。
让我们说简与珍妮特结婚,所以他们都分享同样的孩子,所以他们都分享:
$janet = ConcretePerson::build('Janet', 'Peach');
$janet->setChildren($janesChildren);
现在珍妮特得到了一个新的孩子:
$janet->getChildren()->attachPerson(ConcretePerson::build('Feli'));
自动Jane也是如此,因为它们共享相同的子对象。
然而,对于这些类型集合,PHP并不强大,因此您需要完成一些样板代码才能完成此任务。