I have implemented a basic snipe of code based in decorator pattern.
Decorator class:
abstract class HTMLDecorator {
/** @var \ArrayObject */
protected $notes;
public function format(){
$html = '';
foreach ($this->getNodes() as $node)
$html .= "<p>{$node}</p>";
return $html;
}
}
This is the base class:
class HTML extends HTMLDecorator{
public function __construct(){
$this->nodes = new \ArrayObject();
}
public function getNodes(){
return $this->nodes;
}
}
Now, these two classes add nodes to the html array.
Block:
class BlockHtml extends HTMLDecorator{
protected $html;
public function __construct(HTMLDecorator $html){
$this->html = $html;
}
public function getNodes()
{
$this->html->getNodes()->append('Block html');
return $this->html->getNodes();
}
}
Image:
class ImageHtml extends HTMLDecorator{
protected $html;
public function __construct(HTMLDecorator $html){
$this->html = $html;
}
public function getNodes()
{
$this->html->getNodes()->append('Image html');
return $this->html->getNodes();
}
}
Finally, I have tested it as doing:
$html = new HTML()
$html = BlockHTML($html);
$html = ImageHTML($html);
echo $html->format();
The result is:
Block html
Image html
Block html
Why does code print "Block html" twice?