需要扩展一个类以在原始类生成的元素内生成新的DOM元素。
我有一个生成图像网格的类。现在我需要在不触及原始类的情况下为图像添加标题。
例:
class Foo
{public $img_url;
function make_img() {
echo '<div><img src="' . $this->img_url . '"></div>';
}
期望的结果:
<div><div class="imageTitle">Img Title</div><img src="imgurl"></div>
如果函数确实使用echo,那么除了覆盖整个行为之外,没有其他解决方案:
class FooExtended extends Foo{
public $title ;
public function __construct()
{
$this->title = 'my Title';
}
function make_img() {
echo '<div><div class="imageTitle">' . $this->title . '</div><img src="' . $this->img_url . '"></div>' ;
}
}
现在,如果使用$foo2 = new FooExtended();
创建元素,则每次调用make_img()
时都会应用新行为。问题是如果修改了Foo
类,你需要记住编辑FooExtended
。
如果函数返回一个字符串而不是打印它,则可以先调用父函数,然后处理结果字符串以添加所需的信息。
function make_img() {
$basic = parent::make_img(); // call the parent function
$tmpDoc = new DOMDocument();
$tmpDoc->loadXml($basic);
$titleNode = $tmpDoc->createElement('div', $this->title);
$titleClass = $tmpDoc->createAttribute('class');
$titleClass->value = 'imageTitle';
$titleNode->appendChild($titleClass);
$imgNode = $tmpDoc->getElementsByTagName('img')->item(0);
$imgNode->parentNode->insertBefore($titleNode, $imgNode);
return $tmpDoc->saveXml($tmpDoc->documentElement, LIBXML_NOEMPTYTAG) ;
}