输入Doctypes

时间:2009-08-17 17:15:04

标签: php oop doctype

我有一个Document类,负责保存最终被gzip压缩然后打印到页面上的文档。在该文档中保存文档的DocType。我面临的问题是如何正确实现显示Doctype。

例如:我可以创建最常用的流行Doctypes数组,然后如果输入'strict',它会自动选择HTML 4.01 Strict。如果没有已知的DocType,则可以假定您输入的是自定义DocType,并且只显示您输入的内容。这似乎容易出错并且很容易出现。

    $document->setDoctype("strict");

    ..... in a class far, far, away........
    function setDocType($type)
    {
        if(in_array($type, $this->doctypes))
         {
             $this->doctype = $this->doctypes[$type];
         }
         else
         {
             $this->doctype = $type;
         }
    }

另一种方法是每次只需输入整个DocType。

$document->setDoctype('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">');

你会如何处理这个问题?

3 个答案:

答案 0 :(得分:1)

我认为您应该检查doctype w3c列表。 http://www.w3.org/QA/2002/04/valid-dtd-list.html

答案 1 :(得分:1)

这取决于您是否要允许输入自定义文档类型。如果您认为这种情况是异常,那么当有人尝试使用未定义的doctype时,您应该抛出异常。您还可以在设置实际doctype之前提供一种定义自定义doctype和强制使用该方法的方法。

我会做这样的事情:

class Document {
    private $doctypes = array(
        'html4' => '...',
        'xhtml1strict' => '...'
    );

    private $doctype = null;

    public function addCustomDocType($name, $definition) {
        if (empty($this->doctypes[$name])) {
            $this->doctypes[$name] = $definition;
        } else {
            throw new Exception('Definition already exists');
        }
    }

    public function setDocType($name) {
        if (!empty($this->doctypes[$name])) {
            $this->doctype = $this->doctypes[$name];
        } else {
            throw new Exception('Doctype not found');
        }
    }
}

你必须输入doctype定义的第二个解决方案是IMO难看,我会避免它。

答案 2 :(得分:0)

是否允许用户输入自定义文档类型?

也许创建一个基类

文档

并将其扩展到每种类型,例如:

StrictDoc扩展了Doc 等

它会为每个人设置自己的doc类型。如果要添加到doc类型,只需创建另一个扩展Doc。

的类