Referenzieren Sie eine Methode des Containerobjekts in PHP?

8

Gegeben in PHP:

%Vor%

Ich frage mich, ob es für die 'bar'-Klasse möglich ist, die' magic bullet'-Methode der 'foo'-Klasse aufzurufen. Die 'bar'-Instanz ist in der Instanz' foo 'enthalten, befindet sich jedoch nicht in einer Eltern / Kind-Beziehung. Tatsächlich habe ich viele verschiedene "Bar" -Klassen, die "foo" in einem Array hat, jeder macht etwas anderes als $ id, bevor er es an die "magic_bullet" -Funktion für ein Endergebnis weitergeben möchte, also eine Struktur sperrt Änderung der Klassenbeziehungen, ist es möglich, auf eine Methode einer 'Container'-Instanz zuzugreifen?

    
MidnightLightning 06.08.2009, 17:30
quelle

5 Antworten

4

Sie müssen Ihren Code ändern, um eine Beziehung bereitzustellen. In OOP-Sprache nennen wir das Aggregation .

Angenommen, PHP 4 und die Idee von "einer Reihe von Bars"

%Vor%     
Peter Bailey 06.08.2009, 17:49
quelle
4

Nein, das ist nicht möglich, da keine Beziehung definiert ist.

Ich würde vorschlagen, dass Sie, anstatt die Eigenschaft $test->bar direkt zu setzen, einen Setter verwenden und eine Beziehung auf diese Weise herstellen können. Außerdem müssen Sie der Klasse container eine bar -Eigenschaft hinzufügen. Innerhalb der Klasse foo :

%Vor%

Dies stellt eine Beziehung zwischen den Objekten her. Ändern Sie nun die Funktion bar::target($id) zu:

%Vor%

Das solltest du jetzt tun können:

%Vor%     
zombat 06.08.2009 17:36
quelle
1

Das sieht für mich (obwohl nur basierend auf dem Code, den Sie gezeigt haben!) ein perfekter Fall für eine statische Methode aus ...

%Vor%

Oder, wenn es immer nur ein "Foo" -Objekt geben wird - vielleicht ein Singleton Design-Muster?

    
Mez 06.08.2009 17:51
quelle
0

Sie $bar Instanz, innerhalb von Foo, hat keine Möglichkeit zu wissen, was die Klasse enthält; Also, keine Möglichkeit, irgendeine Methode von diesem zu nennen.

(Nun, vielleicht (wahrscheinlich nicht) mit Reflection zu arbeiten ... Ich sollte das eines Tages versuchen ^^)

EDIT: ein wenig darüber nachdenken: Sie könnten innerhalb Ihrer Bar-Klasse einen Zeiger auf foo halten; ein bisschen so:

%Vor%

Beachten Sie, dass ich method_exists als Sicherheitsmaßnahme verwendet habe.

Und Sie werden bekommen:

%Vor%

Also, es kann getan werden ... Wenn Sie Ihren Code ein bisschen ändern; -)


Bearbeiten 2: ho, zombat schlug mich dazu, es scheint: - (

    
Pascal MARTIN 06.08.2009 17:36
quelle
0

Sie haben hier ein paar Optionen. Ich würde empfehlen, den globalen Weg zu gehen.

%Vor%

Dies würde funktionieren, wenn Sie $ test im Konstruktor von bar speichern. Sie könnten auch:

%Vor%

... und verwende das angegebene Testobjekt in der target () Methode von bar.

    
Lucas Oman 06.08.2009 17:42
quelle

Tags und Links