PHP对象作为属性

时间:2013-03-07 13:55:53

标签: php object

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

例如:

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

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

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

这可能吗?

2 个答案:

答案 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。这将使您的工作更加具体。

foreachDocs而言,您的所有子对象需要做的是实现IteratorIteratorAggregate接口,然后可以在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并不强大,因此您需要完成一些样板代码才能完成此任务。

code gist