2009-08-17 184 views
0

我有一個Document類,它負責保存最終將被壓縮並打印到頁面上的文檔。在該文檔中保存文檔的DocType。我面臨的問題是如何正確實現顯示Doctype。輸入文檔類型

例如:我可以創建一個最常用的常用Doctype數組,然後如果輸入'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">'); 

你會如何處理這個問題?

回答

1

這取決於您是否允許輸入自定義文檔類型。如果你認爲這種情況是個例外,那麼當有人試圖使用未定義的文檔類型時,你應該拋出異常。在設置實際的文檔類型之前,您還可以提供一種方法來定義自定義文檔類型並強制使用該方法。

我會做這樣的事情:

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醜陋,我會避免。

+0

正是我在找的東西。 – 2009-08-17 17:36:45

0

是否允許用戶輸入自定義文檔類型?

也許創建一個基類

文件

並將其擴展到每種類型,例如:

StrictDoc擴展文件 等

,它會設置自己的文檔類型爲每個。如果你想添加到文檔類型,只需創建另一個擴展文檔的類。