我有一个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">');
你会如何处理这个问题?
答案 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。
的类