2008-09-15 15 views
2

Eine Instanz der Klasse A ein paar andere Objekte instanziiert, sagen wir zum Beispiel aus der Klasse B:Wie greife ich auf Klassenvariablen eines Elternobjekts in PHP zu?

$foo = new B(); 

I A der Variablen öffentliche Klasse von Methoden

innerhalb B. zugreifen möchten Es sei denn, ich bin etwas, der einzige Weg, fehlt dies zu tun, ist das aktuelle Objekt zu den Instanzen von B passieren:

$foo = new B($this); 

ist die beste Praxis oder gibt es eine andere Möglichkeit, dies zu tun?

Antwort

2

, die mir gut aussieht, neige ich dazu, eine Daumenregel von verwenden „jemand diese es verstehen beibehalten würde?“ und das ist eine leicht verständliche Lösung.

Wenn nur ein „A“ ist, könnten Sie betrachten das Registrierungsmuster verwendet, siehe zum Beispiel http://www.phppatterns.com/docs/design/the_registry

+0

Vielen Dank. In meinem speziellen Fall gilt das Registrierungsmuster in der Tat. (Klasse A öffnet mehrere Datenbankverbindungen und muss Konfigurationsinformationen an B und andere Klassen übergeben.) –

1

Ich würde zuerst prüfen, ob Sie nicht das falsche Muster verwenden: Aus Ihrer Anwendungslogik sollte wirklich über A wissen B? Wenn B über A wissen muss, scheint eine Eltern-Kind-Beziehung nicht ganz angemessen zu sein. Zum Beispiel könnte A das Kind sein, oder ein Teil der Logik von A könnte in ein drittes Objekt gehen, das "unter" B in der Hierarchie liegt (d. H. Nicht über B weiß).

Das heißt, ich würde vorschlagen, eine Methode in B haben eine als Datenquelle zu registrieren, oder ein Verfahren in einem schaffen B als Observer und ein Anpassungsverfahren in B zu registrieren, die A verwendet B der Wert zu benachrichtigen Änderungen.

0

Ähnlich wie Paulus sagte, wenn es nur ein A ist, Sie, dass als Singleton implementieren können. Sie können dann die Instanz von A als Argument an den Konstruktor übergeben (Aggregation), mit einer Setter-Methode (im Wesentlichen wieder Aggregation), oder Sie können diese Beziehung direkt im Konstruktor setzen (Komposition).

Doch während Singletons mächtig sind, vorsichtig sein, sie mit der Zusammensetzung der Umsetzung. Es ist schön zu denken, dass man es auf diese Weise machen kann und ein Konstruktorargument los wird, aber es macht es auch unmöglich, A durch etwas anderes zu ersetzen, ohne einen Code neu zu schreiben. Peronsally, würde ich mit Aggregation bleiben, auch wenn ein Singleton mit

$foo = new B(A::getInstance()); 
0
$foo = new B($this); 

-Code wie dies leider nicht meine Bedürfnisse passt. Gibt es eine andere Möglichkeit, auf die Eigenschaften des übergeordneten Objekts zuzugreifen?

Ich werde versuchen zu erklären, warum. Wir schreiben eine Spielesoftware und einige Klassen haben sehr "ungewöhnliche" Abhängigkeiten und beeinflussen sich gegenseitig auf unterschiedliche Weise. Das ist der Grund, warum Code manchmal ohne Unterstützung von Eltern fast nicht mehr unterstützt wird (manchmal sogar mehrere Eltern aus verschiedenen Kontexten, d. H. Ein Squad kann zu Battle und zu User etc. gehören).

Und nun der Grund, warum Links mich nicht befriedigen. Wenn ich eine Ausgabe für die Clientseite erzeuge, verwende ich eine Art von serialisierenden Objekten in XML. Es funktioniert sehr gut, bis es rekursive Referenzen wie die Links zu den Eltern trifft. Ich kann sie beschützen, aber dann verlieren sie ihre Verwendung, d. H.(Dummy-Beispiel)

$this->squad->battle->getTeam($tid)->getSquad($sqid)->damageCreature(...); 

Der andere Weg - Serialisierungsmethode in jeder serializable Klasse zu implementieren und es in Serializer wie folgt aufrufen:

$obj->toXML($node); 
$this->appendChild($node); 

aber das ist eine Menge Sachen zu schreiben und zu unterstützen! Und manchmal erzeuge ich die Objekte für den Serializer dynamisch (weniger Verkehr).

Ich denke sogar über einen Hack: zu "lehren" Serializer einige Eigenschaften in bestimmten Klassen zu ignorieren)). Huh ... schlechte Idee ...

Es ist eine lange Diskussion, aber glauben Sie mir, dass Registry und Observer nicht passen. Gibt es noch andere Ideen?

Verwandte Themen