扩展类以在原始类生成的html中插入新的html元素

问题描述 投票:0回答:1

需要扩展一个类以在原始类生成的元素内生成新的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>
php
1个回答
1
投票

如果函数确实使用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) ;
}
© www.soinside.com 2019 - 2024. All rights reserved.