Klassenmethoden von PHP Biliothek überschreiben
siGGi
- php
Hallo zusammen,
gibt es die Möglichkeit in PHP Klassenmethoden von Klassen aus der PHP-internen Bibliothek zu überschreiben? Ich würde gerne ein paar Modifikationen an den DOMNode- und DOMElement-Klassen vornehmen. Ich würde gerne vermeiden, von den Klassen abzuleiten, da ich sonst eine Unmenge ändern müsste.
Grüße
siGGi
Hallo!
gibt es die Möglichkeit in PHP Klassenmethoden von Klassen aus der PHP-internen Bibliothek zu überschreiben? Ich würde gerne ein paar Modifikationen an den DOMNode- und DOMElement-Klassen vornehmen. Ich würde gerne vermeiden, von den Klassen abzuleiten, da ich sonst eine Unmenge ändern müsste.
Das verstehe ich so nicht ganz: wie willst Du Methoden überschreiben, ohne abzuleiten?
Welche Unmenge mußt Du ändern, wenn Du von einer Klasse ableitest?
Ich nehme an, Du suchst eine Lösung in PHP und keinen Eingriff in die C-Sourcen von PHP, oder?
Beispiel:
class myC extends DOMNode
{
public function appendChild(DOMNode $newnode)
{
// Deine Methode
}
}
Somit hättest Du Deine eigene Methode appendChild definiert - der Rest der Klasse DOMNode bliebe Dir doch durch diese Vererbung erhalten.
Ciao
GG
Wie du in dem Beispiel schon treffend zeigst, möchte ich DOMNode:: appendChild überschreiben, so dass ich auch Objekte vom Typ DOMDocument direkt anhängen kann. Bisher muss ich immer den Umweg über DOMDocument::importNode gehen und es ist irgendwie nervig. Das Problem ist aber, wenn ich von DOMNode ableite zu myDOMNode und dort myDOMNode::appendChild erweitere, gilt diese Erweiterung nicht für DOMDocument, weil DOMDocument immer noch von DOMNode ableitet. Also müsste ich alle Klassen, die von DOMNode ableiten, nun neu definieren und dann in meiner eigenen Klasse von meiner eigenen myDOMNode ableiten lassen. Irgendwie ist das etwas unschön.,, oder?
Bzw ein weiteres Problem ist, dass ich nicht von 2 Klassen erben kann, also ich kann keine myDOMDocument haben, die von DOMDocument und myDOMNode gleichzeitig erbt...
Hallo!
Bzw ein weiteres Problem ist, dass ich nicht von 2 Klassen erben kann, also ich kann keine myDOMDocument haben, die von DOMDocument und myDOMNode gleichzeitig erbt...
Wozu wäre das notwendig?
Vielleicht ist es hilfreich, wenn Du Dein Vorhaben beschreibst, denn ich bin sicher es findet sich ein Lösung dafür.
Ciao
GG
Ich baue ein System, das modulartig eine Website generiert auf Basis von XML und XSLT. Um die verschiedenen Komponenten (z.B. Menü und Inhalt) zu generieren, muss ich den XML-Datensatz generieren und über den XSLTProcessor auf das Template anwenden. Mein Problem liegt nun in der Generierung der XML-Daten, da ich die Menü-Daten und die inhaltlichen Daten separat aus der Datenbank hole und nun in meine gewünschte XML-Datenstruktur umwandeln muss. Hierfür generiere ich ein DOMDocument mit dem Wurzelelement <root></root> und füge dort jeweils Menü und Inhalt ein, z.B.
<root>
<menu>...</menu>
<content>...</content>
</root>
Achja: Jeden Teilbaum der XML-Daten, z.B. den Menü-Teil, erzeuge ich, indem ich ein neues DOMDocument erzeuge. Dies will ich dann im Basisdokument an das den root-Knoten mit appendChild anhängen. Der Weg bisher führt mich immer über importNode und getElementsByTagNames('*'), ist also relativ lang für so eine kleine Operation.
Hi,
Achja: Jeden Teilbaum der XML-Daten, z.B. den Menü-Teil, erzeuge ich, indem ich ein neues DOMDocument erzeuge.
Aha, hier liegt also der Fehler in deinem Konzept.
Dies will ich dann im Basisdokument an das den root-Knoten mit appendChild anhängen. Der Weg bisher führt mich immer über importNode und getElementsByTagNames('*'), ist also relativ lang für so eine kleine Operation.
Du möchtest keine neuen DOMDocumente für die Inhaltsteile erzeugen, sondern lediglich DOMDocumentFragmente, und glücklich werden.
MfG ChrisB
Ja, perfekt! Vielen Dank! Diesen Mini-Abschnitt im PHP-Manual habe ich total übersehen. Ist mein erstes Projekt mit XML/XSLT!
Hi,
Ja, perfekt! Vielen Dank! Diesen Mini-Abschnitt im PHP-Manual habe ich total übersehen.
Und dabei ist das nicht mal PHP-spezifisch, sondern allgemein Bestandteil von "DOM".
Wie ich schon sagte: Immer erst mal schauen, wie man etwas mit den Möglichkeiten, die ein bewährtes Konzept (hier: DOM) einem bietet, lösen kann, bevor man sich beim Basteln von gar nicht notwendigen "Workarounds" in anderen Gefilden (PHP) verzettelt.
MfG ChrisB
Irgendwie klappt das mit DOMDocumentFragment nicht. Dauernd kommen Exceptions von wegen "No Modification Allowed Error". Es geht schon los, wenn ich mit DOMElement ein neues Element erstellen will, dass dann mittels DOMElement::setAttribute ein Attribut bekommen soll. Da kommt der o.g. Fehler schon, warum auch immer. Wenn ich dann als Basis-Objekt ein DOMDocument nehme, kann ich immerhin ein Element erzeugen, das auch ein Attribut hat, aber ich kann kein DOMDocumentFragment mehr erzeugen letztlich. Kann jemand vielleicht einen Beispiel-Code zum Erstellen eines DOMDocumentFragments zeigen? Ich habe schon bei google gesucht, konnte aber nichts brauchbares finden, außer, dass viele andere auch so ein Problem haben.
Hi,
Irgendwie klappt das mit DOMDocumentFragment nicht.
Irgendwie keine brauchbare Problembeschreibung.
Dauernd kommen Exceptions von wegen "No Modification Allowed Error". Es geht schon los, wenn ich mit DOMElement ein neues Element erstellen will, dass dann mittels DOMElement::setAttribute ein Attribut bekommen soll. Da kommt der o.g. Fehler schon, warum auch immer.
Und was genau machst du?
Wenn ich dann als Basis-Objekt ein DOMDocument nehme, kann ich immerhin ein Element erzeugen, das auch ein Attribut hat, aber ich kann kein DOMDocumentFragment mehr erzeugen letztlich.
Code?
Kann jemand vielleicht einen Beispiel-Code zum Erstellen eines DOMDocumentFragments zeigen?
Den gibt's schon auf der Handbuchseite im Nutzerkommentar.
MfG ChrisB
Hi,
Wie du in dem Beispiel schon treffend zeigst, möchte ich DOMNode:: appendChild überschreiben, so dass ich auch Objekte vom Typ DOMDocument direkt anhängen kann. Bisher muss ich immer den Umweg über DOMDocument::importNode gehen und es ist irgendwie nervig.
Das ist aber genau der vorgesehene Weg.
Das Problem ist aber, wenn ich von DOMNode ableite zu myDOMNode und dort myDOMNode::appendChild erweitere, gilt diese Erweiterung nicht für DOMDocument, weil DOMDocument immer noch von DOMNode ableitet. Also müsste ich alle Klassen, die von DOMNode ableiten, nun neu definieren und dann in meiner eigenen Klasse von meiner eigenen myDOMNode ableiten lassen. Irgendwie ist das etwas unschön.,, oder?
Beim Arbeiten mit DOM mit überschriebenen Methoden zu arbeiten, um damit irgendwelche Knotenoperationen zu machen, die DOM so gar nicht vorsieht - und dazu gehört das Einhängen von Knoten ins DOM, die nicht zum Dokument gehören - das scheint mir der unschöne Weg zu sein.
Etwas eigenes basteln, statt das vorhandene in der vorgesehenen Weise zu benutzen, weil man einen zusätzlichen Arbeitsschritt "nervig" findet - das erscheint mir irgendwie nicht sonderlich clever.
MfG ChrisB