2016-04-25 2 views
1

ich eine API-Service baue und eine Elternklasse haben:PHP Klassenreferenz Übergeordnetes Variable

classAPI { 
    public responseCode = ""; 
    public responseMessageLog =""; 
    function run{ 
     // here I call my user auth class 
     $oUser = new classUser(...); 
    } 
} 

In meinem classUser ich ein paar Sachen zu tun und dann eine Reihe von Variablen schreiben: responseMessageLog (die Logbuch, wo das Skript gelaufen ist) und responseCode (welches auf 0 oder 1 oder was auch immer gesetzt ist, abhängig von Erfolg oder Fehlschlag oder Warnung).

Ich muss auf meine responseCode- und responseMessageLog-Variablen innerhalb meiner Benutzerklasse und meiner übergeordneten API-Klasse zugreifen, aber ich möchte diese Variablen nicht wirklich in jede untergeordnete Klasse weiterleiten und sie dann zurückgeben. Ich würde es mögen, dass, wenn ich die Variable in der Kindklasse aktualisiere, es überall in meiner ganzen Klasse aktualisiert .... irgendwie wie eine globale Variable würde ... aber ich weiß, dass das keine gute Idee ist.

Wie haben andere aufgehört, Variablen auf der Kaninchenspur der Klassen weiterzugeben.

in dieser Klasse I

Antwort

0

Passing Abhängigkeiten ist kein Kaninchenbau Sie vermeiden wollen - es ist für mehr prüfbar Code macht. Sie müssen jedoch nicht jede Eigenschaft übergeben, Sie können das übergeordnete Objekt übergeben.

In Ihrem Fall übergeben Sie einfach das Objekt classAPI in den Konstruktor der classUser und im Konstruktor zuweisen Eigenschaft. Die Eigenschaften classAPI sind öffentlich, sodass Sie in einer Instanz von classUser darauf zugreifen können.

ClassAPI { 
    public $responseCode = ""; 
    public $responseMessageLog =""; 

    public function run{ 
     // here I call my user auth class 
     $oUser = new ClassUser($this, ...); 
     } 
    } 

ClassUser { 
    public $myClassApi = null; 

    public function __construct(ClassAPI $myClassApi) { 

     $this->myClassApi = $myClassApi; 
     } 

    public function someFunction() { 
     echo $this->myClassApi->responseCode; 
    } 

    } 

Added Hinweise:

  • Im Fall kommt es in einer anderen Antwort auf, verwenden Sie keine statischen Eigenschaften zu tun, was Sie zu tun versuchen.
  • Stärken Sie Ihre Klassennamen.
  • Im Produktionscode könnte ich eine Initialisierungsfunktion in ClasUser stattdessen die ClassAPI direkt in den Konstruktor übergeben.
+0

oh wirklich! dang, die kleinen Dinge, die du vergisst ... lass mich das versuchen ... –

+0

kann ich auch Methoden wie diese nennen? –

+0

@NathanLeggatt Wenn sie öffentliche Sichtbarkeit sind (nicht privat oder geschützt) – Ray