RegisterNodeClass PHP ile DOMElement genişletme

0 Cevap php

registerNodeClass PHP çeşitli DOMNode tabanlı DOM sınıfları uzatmak için harika, ama ben bir seviye daha derin gitmek gerekir.

I've created an extDOMElement that extends DOMElement. This works great with registerNodeClass, but I would like to have something that works more like this: registerNodeClass("DOMElement->nodeName='XYZ'", 'extDOMXYZElement')

Aşağıdaki XML belge, animals.xml düşünün:

<animals>
    <dog name="fido" />
    <dog name="lucky" />
    <cat name="scratchy" />
    <horse name="flicka" />
</animals>

Aşağıdaki kodu göz önünde bulundurun:

extDomDocument extends DOMDocument {
    public function processAnimals() {
        $animals = $this->documentElement->childNodes;
        foreach($animals as $animal) {
            $animal->process();
        }
    }
}


extDOMElement extends DOMElement {
    public function process() {
        if ($this->nodeName=='dog'){
            $this->bark();
        } elseif ($this->nodeName=='cat'){
            $this->meow();
        } elseif  ($this->nodeName=='horse'){
            $this->whinny();
        }
        this->setAttribute('processed','true');
    }
    private function bark () {
        echo "$this->getAttribute('name') the $this->nodeName barks!";
    }
    private function meow() {
        echo "$this->getAttribute('name') the $this->nodeName meows!";
    }
    private function whinny() {
        echo "$this->getAttribute('name') the $this->nodeName whinnies!";
    }
}

$doc = new extDOMDocument();
$doc->registerNodeClass('DOMElement', 'extDOMElement');
$doc->loadXMLFile('animals.xml');
$doc->processAnimals();
$doc->saveXMLFile('animals_processed_' . Now() . '.xml');

Output: fido the dog barks! lucky the dog barks! scratchy the cat meows! flicka the horse whinnies!

Ben kabuğu koymak zorunda istemiyorum (), miyav () ve extDOMElement içine whinny () - Ben sırasıyla extDOMDogElement, extDOMCatElement ve extDOMHorseElement, içine onları koymak istiyorum.

Ben burada Dekoratör ve Strateji modellerine baktım, ama ben devam etmek nasıl tam olarak emin değilim. Geçerli ayarı Tamam çalışır, ama ben ana sınıfları dışında yöntemler ve her Element belirli özellikleri ayrı böylece ben, her elementName için ayrı sınıflar ile extDOMElement ortak özelliklerini ve yöntemlerini olmasını tercih ederim.

0 Cevap