Kontakt
Telefon +49 2161 17 58 83
Mobil +49 179 72 66 112
E-Mail info@ulrich-borchers.de

DOM: Nicht nur Kathedralen brauchen eine saubere Fassade

Was ist eigentlich eine "ewige Baustelle"? "Sowatt jibbet nisch!" ... sagt kein Kölner, denn der weiß: "Sischer dat et dat jibt". Das Leben? Auch. Er aber kann sich bei dieser Antwort ganz sicher sein: Der Kölner Dom! Die ewige Baustelle. Wenn nur nicht dieses hässliche Baugerüst wäre. Besser ohne - dann klingt es so: Do you speak PHP4? "Yes". "No". PHP5? "No." "Yes!". What do you see, both of you ...? "Public Nice_Fassade()" "Agreed()".

Wat soll dat dann? Bisse bekloppt jeworden? Jein. Okay, versachlichen wir es, atmen wir wieder durch: Code ein, Code aus, Code ein, Code aus, alles beruhigt sich, Ordnung kehrt langsam wieder ein ... wir sind schließlich Entwickler, omm, bringen wir es auf den Punkt, ganz in Code:

Notice anything?

INCOMPATIBLE! OH NO!!!!!!

Does it have to be ... compatible?

Depends on your needs ...

Does your application utilize XML and DOM? Does it have to function both on PHP4 and PHP5 platforms?



BTW: Denglisch (deutsch+englisch)? Don't let me confuse you. Es gibt auch dafür eine sprachübergreifende Fassadentechnologie: Sourcecode at the rescue:

Ergo:

Usage

//don't worry if you are running on PHP4 or PHP5:
$dom = new DOMDocument_Fassade();
$dom->loadXml($xmlString);
$dom->addXmlChild($query, $xmlStr);
//...

Fassade, implicit

interface DOMDocument_Interface
{
    public function load($filename);
    public function loadXml($xmlString);
    public function getXml();
    public function writeXml($filename);
    public function xpath($query, $contextNode = null);
    public function createElement($name);
    public function appendChild($child, $element);
    public function setAttrib($name, $value, $element);
    public function setValue($value, $element);
    public function getAttrib($attribute, $element);
    public function getValue($node);
    public function getName($element);
    public function removeChild($childNode, $parentNode);
    public function addXmlChild($query, $xmlStr, $position = null, $childTag = null);
}

Backend PHP4

class DOMDocument_PHP4 // implements DOMDocument_Interface
{
    var $_doc;
    
    function XmlConfig_DOMXML()
    {
        $this->_doc = domxml_new_doc('1.0');
    }
    
    function load($filename)
    {
        $this->_doc = domxml_open_file($filename);
        return isset($this->_doc) ? true : false;
    }
    
    function loadXml($xmlString)
    {
        $this->_doc = domxml_open_mem($xmlString);
        return isset($this->_doc) ? true : false;
    }
    
    function getXml()
    {
        return $this->_doc->dump_mem(true);
    }
    
    //full implementation skipped ...
}

Backend PHP5

class DOMDocument_PHP5 // implements DOMDocument_Interface
{
    protected $_doc;
    
    public function __construct()
    {
        $this->_doc = new DOMDocument('1.0', 'UTF-8');
        $this->_doc->formatOutput = true;
        $this->_doc->preserveWhiteSpace = false;
    }
    
    public function load($filename)
    {
        return $this->_doc->load($filename);
    }
    
    public function loadXml($xmlString)
    {
        return $this->_doc->loadXML($xmlString);
    }
    
    public function getXml()
    {
        return $this->_doc->saveXML();
    }
    
    //full implementation skipped ...
}

Fassade

class DOMDocument_Fassade // implements DOMDocument_Interface
{
    /**
     * @var DOMDocument_Interface
     */
    var $_backend = null;

    function DOMDocument_Fassade()
    {
        $this->_initBackend();
        $this->_initDoc();
    }

    function _initDoc()
    {
        $classname = $this->_backendClassname;
        $this->_backend = new $classname();
    }

    function _initBackend()
    {
        $dir = realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'DOMDocument' . DIRECTORY_SEPARATOR;

        if (version_compare(PHP_VERSION, '5.0.0') >= 0) {
            $this->_backendClassname = 'DOMDocument_PHP5';
            require_once($dir . 'PHP5.php');
        }
        else {
            $this->_backendClassname = 'DOMDocument_PHP4';
            require_once($dir . 'PHP4.php');
        }
    }

    //Fassade:

    public function load($filename)
    {
        return $this->_backend->load($filename);
    }

    public function loadXml($xmlString)
    {
        return $this->_backend->loadXml($xmlString);
    }

    public function getXml()
    {
        return $this->_backend->getXml();
    }
    
    //full implementation skipped ...
}

Download full code?

You are welcome:

domdocument-fassade.zip

 

 

Zurück

Hands On PHP

Harter Hut

Programmiertes - Jenseits von Prosa.

Zend Certified Engineer
Zend Certified Engineer ZF
Oracle Certified Professional, MySQL 5.6 Developer
Sun Certified Java Programmer (SCJP)
Sun Certified Web Component Developer (SCWCD)
RSS
tl_files/open_clip_art/symbole/rss-icon.png  Abonnieren