Вопрос
У меня есть Document
класс, который отвечает за хранение документа, который в конечном итоге будет сжат и затем распечатан на странице.В этом документе содержится DocType документа.Проблема, с которой я сталкиваюсь, заключается в том, как правильно реализовать отображение Doctype.
Например:Я мог бы создать массив популярных типов документов, которые являются наиболее часто используемыми, а затем, если вы введете 'strict', он автоматически выберет HTML 4.01 Strict
.Если известного типа документа нет, можно предположить, что вы вводите пользовательский тип документа, и просто отобразить то, что вы ввели.Это кажется подверженным ошибкам и неуклюжим.
$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">');
Как бы вы справились с этой проблемой?
Решение
Это зависит от того, хотите ли вы разрешить ввод пользовательских типов документов.Если вы считаете эту ситуацию исключением, вам, вероятно, следует выдавать исключение, когда кто-то пытается использовать undefined 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 уродливым, и я бы избегал его.
Другие советы
Я думаю, вам следует просто проверить список doctype w3c.http://www.w3.org/QA/2002/04/valid-dtd-list.html
Разрешено ли пользователям вводить пользовательский doctype?
Возможно, создать базовый класс
Док
И распространить его на каждый тип, например:
StrictDoc расширяет Doc и т.д.
И он установит свой собственный тип документа для каждого из них.Если вы хотите добавить к типам doc, просто создайте другой класс, расширяющий Doc.