I’m recently working on a tree structure, multiple nodes, multiple and increasable levels, and a print() method.
At first, i thought it should be a Composite, i then wrote down some possible design and codes:

$struc = new Node(‘name0’, ‘id0’, ‘desc0’);
$node1 = new Node(‘node1’, ‘id1’, ‘desc1’);
$node2 = new Node(‘node2’, ‘id2’, ‘desc2’);
$node3 = new Node(‘node3’, ‘id3’, ‘desc3’);
$leaf1 = new Leaf(‘leaf1’, ‘ld1’, ‘lesc1’);
$leaf2 = new Leaf(‘leaf2’, ‘ld2’, ‘lesc2’);
$leaf3 = new Leaf(‘leaf3’, ‘ld3’, ‘lesc3’);
$leaf4 = new Leaf(‘leaf4’, ‘ld4’, ‘lesc4’);
$struc.add($node1);
$struc.add($node3);
$node1.add($leaf1);
$node1.add($leaf2);
$node1.add($node2);
$node2.add($leaf3);
$node3.add($leaf4);
Looks good, i think and begin coding, print() method may follow Iterator pattern later.
But during coding, i feel is it too complex for these simple nodes? And i have to instantiate a lot of concrete classes (more than 50+, and increasing). I then stopped and thinking a simple similar way by using array:
-- Structure Class --
//To be more readable and clear, array here could be
//divided to 3 arrays(root/nodes/leafs), then connect
//in a similar way Composite does.
$struc = array('name0', 'id0', 'desc0',
'children'=>array(
array('node1', 'id1', 'desc1',
'children' => array(
array('leaf1', 'ld1', 'lesc1'),
array('leaf2', 'ld2', 'lesc2'),
array('node2', 'id2', 'desc2',
'children'=>array(array('leaf3', 'ld3', 'lesc3'))
)
)
),
array('node3', 'id3', 'desc3',
'children' => array(array('leaf4', 'ld4', 'lesc4'))
)
)
);
function print($node = $this->struct) {
...
if(isset($node['children'])) $this->print($node['children']);
...
}
The two designs look very similar, now i’m a little confused, what’s the value of Composite pattern, am i missed something important of this pattern?
The point of the composite pattern is to be able to treat a collection of objects as if it were a single object (e.g. for displaying it or writing it to a file). As you write yourself “print() method may follow Iterator pattern later” – well, the point of the composite pattern would be that you could call print() without having to worry about whether you’re printing a single Component or have to iterate through an entire Tree.
But it looks as though you’re unclear about object-oriented programming in general, since you’re considering using nested arrays instead. The value of using objects instead of hashes (which PHP arrays are) for everything is type safety, which makes it much easier to debug and maintain programs.