如何正确创建HTML类?

时间:2009-07-13 20:41:45

标签: php html class logic

我正在使用PHP中的HTML类,这样我们就可以保持所有HTML输出的一致性。但是,我在绕过逻辑时遇到了一些麻烦。我在PHP工作,但任何语言的答案都可以。

我希望该类正确嵌套标记,因此我希望能够像这样调用:

$html = new HTML;

$html->tag("html");
$html->tag("head");
$html->close();
$html->tag("body");
$html->close();
$html->close();

类代码在幕后使用数组,并推送数据,弹出数据。我非常确定我需要创建一个子数组,以便在<head>下面有<html>,但我无法弄清楚逻辑。以下是HTML类的实际代码:

class HTML {

    /**
     * internal tag counter
     * @var int
     */ 
    private $t_counter = 0;

    /** 
     * create the tag
     * @author Glen Solsberry
     */
    public function tag($tag = "") {
        $this->t_counter = count($this->tags); // this points to the actual array slice
        $this->tags[$this->t_counter] = $tag; // add the tag to the list
        $this->attrs[$this->t_counter] = array(); // make sure to set up the attributes
        return $this;
    }   

    /**
     * set attributes on a tag
     * @author Glen Solsberry
     */ 
    public function attr($key, $value) {
        $this->attrs[$this->t_counter][$key] = $value;

        return $this;
    }

    public function text($text = "") {
        $this->text[$this->t_counter] = $text;

        return $this;
    }

    public function close() {
        $this->t_counter--; // update the counter so that we know that this tag is complete

        return $this;
    }

    function __toString() {
        $tag = $this->t_counter + 1;

        $output = "<" . $this->tags[$tag];
        foreach ($this->attrs[$tag] as $key => $value) {
            $output .= " {$key}=\"" . htmlspecialchars($value) . "\"";
        }
        $output .= ">";
        $output .= $this->text[$tag];
        $output .= "</" . $this->tags[$tag] . ">";

        unset($this->tags[$tag]);
        unset($this->attrs[$tag]);
        unset($this->text[$tag]);

        $this->t_counter = $tag;

        return $output;
    }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

当它归结为它时,可能更容易使用PHP的现有DOM构造函数之一。

如果这似乎不合理;简单地将一个数组作为类的成员来保持子元素应该是奇迹。