Wie erhalte ich einen iterativen Objektreferenz auf das Root-Objekt in PHP?

8

Ich habe eine Klasse, die ein wenig HTML5 benötigt und mit etwas DOM-Magie in eine Klasse verwandelt, die eine Erweiterung simpleXMLElement ist. Dies alles beginnt bei einer "Fabrik" (ich könnte diesen Begriff leicht missbrauchen) Klasse namens XPage.

Also könnten wir

haben %Vor%

So weit, so gut. Was ich jetzt tun muss, ist, einige Teile des XML-Dokuments auszuwählen, damit sie "mit Lesezeichen versehen" werden können (ich bin mir sicher, dass es einen besseren Namen dafür gibt), damit man so vorgehen kann

%Vor%

Idealerweise würde ich gerne gehen können

%Vor%

Oder etwas intuitiv Ähnliches. Was dann passieren sollte ist, dass das Objekt $ MyPage (vom Typ XPage) die Referenz für, in diesem Fall html / body / header (das ist wahrscheinlich nicht ganz die richtige XPath-Notation, aber hoffentlich können Sie folgen) sollte weitergegeben werden.

Die Idee ist, dass die am häufigsten zugänglichen Bereiche flüssiger gestaltet werden können. Dies ist der Punkt, an dem die SimpleXML-Klasse (selbst mit meiner Erweiterung) auf etwas hinausläuft, was ohne eine andere Factory nicht möglich ist und XPage zu einem Singleton macht.

Es ist jedoch die XPage-Klasse ($ MyPage), die das Array von "Lesezeichen" enthält. Soweit ich weiß, gibt es keine Möglichkeit, einen Verweis in den Iterationen von SimpleXML weiterzuleiten, so dass ein Kind oder ein Kind eines Kindes der Fabrik nicht sagen kann, dass sie "bitte ein Lesezeichen setzen" soll.

Das würde mich böse Sachen machen lassen wie:

%Vor%

Was einfach nicht richtig erscheint.

oder

%Vor%

das ist nicht so schlecht, aber fühlt sich immer noch falsch an.

Wie erreiche ich das ohne übermäßige Objektkopplung oder hässliche Selbstreferenzierung?

Aktualisieren

Ich habe mich gefragt, ob es möglich ist, eine Klasse mit debug_backtrace rückwärts zu durchlaufen, aber die Antwort scheint nein zu sein.

In PHP ist es möglich umzukehren Traversieren Sie eine Traversable-Klasse, um das Root-Objekt zu finden?

Andere ähnliche Tests haben mir gezeigt, dass das Setzen des Wertes einer Klassenvariablen auf ein Element bei keinem anderen Element im durchsuchbaren Stapel möglich ist.

Ich werde mich auf den Wrappervorschlag konzentrieren.

Aktualisieren

SimpleXML ist eigentlich kein echtes Objekt, sondern eine Systemressource. Dies könnte erklären, woher mein Schmerz kam. Sagen Sie die Notizen: Ссылка

Damit sich alle Objekte wie eine Kette von Objekten anfühlen, die sich gegenseitig aufrufen, ist das nicht der Fall.

    
Matthew Brown aka Lord Matt 25.02.2015, 22:25
quelle

2 Antworten

4

Option 1: Verweis auf root

Sie können die Methoden Ihrer XPage-Klasse ändern, um XPage-Objekte anstelle von simpleXMLElements (oder einer anderen Klasse, die simpleXMLElement erweitert) zurückzugeben. Diese Klasse könnte dann eine zusätzliche Eigenschaft haben, die einen Verweis auf das "root" -Element enthält.

Im Grunde würde also Ihre "Wrapper-Klasse" so aussehen (Pseudo-Code voraus!):

%Vor%

Ihr Anwendungsfall von oben würde also so aussehen:

%Vor%

Option 2: Fügen Sie eine ID hinzu

Alternativ können Sie dem Element auch ein ID-Attribut hinzufügen und es folgendermaßen abrufen:

%Vor%     
Lars Ebert 27.02.2015, 15:27
quelle
0

Angesichts des enormen Schubs durch die Antwort von Lars Ebert und nicht ohne eine Reihe von verrückten (und nicht praktikablen) Ideen zu betrachten, bin ich auf eine Klasse mit Final Constructor auf PHP erweitern , was mich zu der Erkenntnis brachte, dass das Entwurfsmuster, das ich brauche, das einer Delegationsklasse ist.

Da ich vielleicht nicht damit fertig bin, der SimpleXMLElement-Erweiterung spezielle Funktionen hinzuzufügen, habe ich magische Methoden verwendet, um einen Delegations-Wrapper zu erstellen. Der Nachteil ist, dass dies in meiner IDE nicht so gut funktioniert, aber es funktioniert erst beim ersten Test. Ich habe Sachen herausgezogen, die sich nur auf mein eigenes Projekt beziehen, aber ansonsten ist das die Lösung, die ich verwende.

Es erfordert das XPage-Objekt, um einige Interface-Elemente zu implementieren (ich werde wahrscheinlich eine Schnittstelle definieren) und es übergibt das SimpleXML-Element mit meinen Erweiterungen und einem Zeiger an sich selbst in diesen Delegations-Wrapper, der sich wie SimpleXML verhält, aber wirklich ein Objekt ist und kann Debug-Meldungen und Selbstreferenzen an XPage übergeben.

%Vor%     
quelle

Tags und Links