我已经实现了基于装饰模式的基本代码狙击。
装饰者类:
abstract class HTMLDecorator {
/** @var \ArrayObject */
protected $notes;
public function format(){
$html = '';
foreach ($this->getNodes() as $node)
$html .= "<p>{$node}</p>";
return $html;
}
}
这是基类:
class HTML extends HTMLDecorator{
public function __construct(){
$this->nodes = new \ArrayObject();
}
public function getNodes(){
return $this->nodes;
}
}
现在,这两个类将节点添加到html数组中。
块:
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();
}
}
图像:
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();
}
}
最后,我测试了它:
$html = new HTML()
$html = BlockHTML($html);
$html = ImageHTML($html);
echo $html->format();
结果是:
Block html
Image html
Block html
为什么代码打印&#34;阻止html&#34;两次?
答案 0 :(得分:1)
使用从$html = ImageHTML($html);
获得的结果调用$html = BlockHTML($html);
可能会导致问题。您可以尝试将返回的值分配给不同的变量并在最后汇编它。