Referenz auf Parameter in Array speichern ?

Alles, was PHP betrifft, kann hier besprochen werden.

Referenz auf Parameter in Array speichern ?

Postby hippe » 04. March 2005 19:56

Hallo,

ich sitze hier vor folgendem Problem:

Situation:
Bin am Bauen einer objektorientierten Oberfläche für eine web-Anwendung.
Dabei arbeite ich unter Suse9.0 mit einem Apache, lokal.
Beim Design versuche ich das Model-View-Controller Prinzip einzuhalten.

Problem:
Nun habe ich folgendes Problem beim Speichern von Refernezen auf Objekte in einem Array:

Ich will, dass die Klasse subject ein Array aufbaut mit allen Observern, die sich bei ihr anmelden. Wenn sich nun das Subject ändert, benachrichtigt es alle im Array befindlichen Observer, dass sich was geändert hat. Diese rufen dann wiederrum getState() mit dem Subject auf, um sich auf den aktuellen Stand zu bringen.
Der Code sieht ca. so aus:


Code: Select all
class subject{
   var $observerList;
        var $aktiv;
        function subject(){
                $this->aktiv = "nothing";   // initial
        }
   function attach(&$observer) { // Melde einen Observer an
      $this->observerList[] = $observer;
      $this->notify(); // Observer soll sich initialisieren
   }
   function getState() { // Gib Zustand zurück
      return $this->aktiv;
   }
   function notify() { // Rufe mit alle Observer call auf
      $anzahl = count($this->observerList);
      for ($i = 0; $i < $anzahl; $i++) {
         //echo "Gut: " . $this->observerList[$i] . "\n";
         $tempObserver = $this->observerList[$i];
         $tempObserver->update();
      }
   }
} // Ende class subject

class navi2Observer {

   var $name;
   var $aktiv;
   var $subject;

   function navi2Observer($newName, &$newSubject) {
      $this->name = $newName;
      $this->subject = $newSubject;
   }
   function update() { // Aktualisieren überschreiben
      $this->aktiv = $this->subject->getState();
      echo "neuer aktivStatus ist: ".$this->aktiv." <br>";
      echo "mein Name ist: ".$this->name;
   }
   function draw() {
      echo "status ist ".$this->aktiv;
   }
} // Ende class navi2Observer


Nun folgt der Aufruf:

Code: Select all
$subjectNavi2 = new navi2Subject();
$observerNavi2 = new navi2Observer("observerNavi2", $subjectNavi2);
$subjectNavi2->attach($observerNavi2);



und es funktioniert nicht :cry: !!
Heißt, wenn ich danach den Status vom Observer abfrage, hat er sich nicht dem Subject angepasst!! Also nicht "nothing" sondern "" !!!
Obwohl der Status des Observers, wenn ich ihn während der update() - Methode ausgebe stimmt, wird er nicht gespeichert ??????
Weiß jemand warum???? Muß irgendetwas mit Refernzen zu tun haben, denn ... ->

ABER, wenn ich folgende Zeile ändere:

Code: Select all
        function attach(&$observer) { // Melde einen Observer an
      $this->observerList[] = $observer;
      $observer->update(); //$this->notify(); // ZEILE GEÄNDERT!!
   }



Dann funktioniert es!! ?? Dann stimmt der Status auch nach der update() - Methode!!

Bin sehr ratlos!!
Und brauche dringend HILFE.

Vielen Dank schonmal und sorry, für die verwirrende Beschreibung :-)

Gruß Philipp
hippe
 
Posts: 6
Joined: 19. February 2005 21:46
Location: Koblenz

Postby hippe » 07. March 2005 11:12

Hei,

ich hab das Problem gelöst.
Ich habe folgende Refernzierung vergessen:

Falsch:
Code: Select all
   function notify() { // Rufe mit alle Observer call auf
      $anzahl = count($this->observerList);
      for ($i = 0; $i < $anzahl; $i++) {
         $tempObserver = $this->observerList[$i];
         $tempObserver->update();
      }


Richtig:
Code: Select all
   function notify() { // Rufe mit alle Observer call auf
      $anzahl = count($this->observerList);
      for ($i = 0; $i < $anzahl; $i++) {
         $tempObserver =& $this->observerList[$i];
         $tempObserver->update();
      }


Viele Grüße
Philipp
hippe
 
Posts: 6
Joined: 19. February 2005 21:46
Location: Koblenz


Return to PHP

Who is online

Users browsing this forum: No registered users and 17 guests