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?
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%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
:
Dies stellt eine Beziehung zwischen den Objekten her. Ändern Sie nun die Funktion bar::target($id)
zu:
Das solltest du jetzt tun können:
%Vor% 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: - (
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.
Tags und Links php