0

图片我想要一个对象 $parent;

例如:

    $parent->firstname = "Firstname";
    $parent->lastname = "Lastname";
    $parent->children = ???

-> 这必须是对象的集合,以便稍后我可以这样做:

    foreach ($parent->children as $child) { 
      $child->firstname
      $child->lastname
    }

这是可能的事情吗?

4

2 回答 2

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) {
    ...
}
于 2013-03-07T14:01:14.220 回答
0

这有点取决于你想要什么。由于您的类型只是属性对象,我认为Vahe Shadunts的解决方案是最轻量级和最简单的。

如果您想在 PHP 中获得更多控制权,您需要使用 getter 和 setter。这将允许您使其工作更具体。

foreachDocs而言,您的孩子对象需要做的就是实现IteratororIteratorAggregate接口,然后可以在内部使用它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 对这些类型化的集合并不强大,因此你有相当多的样板代码来完成这项工作。

代码要点

于 2013-03-07T14:54:20.660 回答