[php5] Übergeordnete Instanz ansprechen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [php5] Übergeordnete Instanz ansprechen

    Hallo,

    gibt es in php5 eine Möglichkeit die übergeordnete Instanz anzusprechen:

    Ich hab eine Klasse namens logger, die Fehler und Systemmeldungen in einen String loggt.

    Jede Klasse die ich programmiere hat eine Methode namens tellName() , die den namen der Klasse zurückgibt.

    Ist es möglich, das logger auf die Methode tellName() der aufrufenden Methode zugreift und sich so automatisch den Namen der Klasse holt die Ihn aufgerufen hat? In Flash gibt es _parent. methode. Damit kann ich auf methode der übergeordneten Instanz zugreifen. In PHP bezieht sich parent auf die Vaterklasse, nicht auf die Instanz.

    Danke Manfred
    Cocoa Entwicklertraining - Alles für die Apfelzucht

  • #2
    du wirst das wohl oder übel der klasse logger mitgeben müssen
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Mist... aber danke für die vernichtende Antwort.
      Cocoa Entwicklertraining - Alles für die Apfelzucht

      Kommentar


      • #4
        naja, so schlimm wird's nicht sein, du rufst doch logger irgendwo auf oder?

        was macht dein tellName() eigentlich?
        liefert es __CLASS__ zurück?
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          PHP-Code:
          <?PHP

          class myclass {
               private 
          $classname='myclass';

                public function 
          tellName () {
                       return 
          $this -> classname;
                }
                 public function 
          irgendwas () {
                        
          $logger = new logger;
                        
          $logger -> logError ('Fehler');
          }
          Wenn logger nun bei der Initialisierung auf tellName () der Instanz zugreifen könnte, könnte logger auch automatisch den Namen der Klasse mitloggen in der der Fehler aufgetreten ist, ohne das ich gross was übergeben muss. Also ind der Art:
          PHP-Code:
          class logger {
                 private 
          $calling_instance;
                 function 
          __construct () {
                         
          $this -> calling_instance _parent -> tellName ();
                  }

          damit wäre logger automatisch versorgt, ohne das ich etwas übergeben muss (wenn es die Konstruktion gäbe).

          Ganz allgemein suche ich nach ner Möglichkeit Zeiger auf Objekte oder so, automatisch weiterzugeben. Ich kenn das von Cocoa (Apple Framework), wo sich neue Instanzen Daten automatisch abholen, natürlich nur wenn in der Instanz die das neue Objekt erzeugt eine entsprechende Klasse vorhanden ist.

          So könnte ich z.B. ein Objekt "datastore" erzeugen, das alle für die Site relevanten Daten beherbergt, und den Zugriff darauf kontrolliert. Alle Objekte die den Datastore benutzen würden sich automatisch einen Zeiger darauf besorgen können ohne das man sich um die übergabe kümmert.

          so long...
          Cocoa Entwicklertraining - Alles für die Apfelzucht

          Kommentar


          • #6
            'ne blödere Lösungsmöglichkeit ist Dir wohl nicht eingefallen .. !
            carpe noctem

            [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
            [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

            Kommentar


            • #7
              Warum blöd ? Wie besser ?
              Cocoa Entwicklertraining - Alles für die Apfelzucht

              Kommentar


              • #8
                entweder den klassennamen direkt beim erzeugen der instanz von logger übergeben (im konstruktor)

                oder, da du schon php5 verwendest, logger als interface einbinden, evtl. geht's ja dann mit dem klassennamen

                oder bei logError übergeben, dann könntest du nämlich ein und dieselbe instanz von logger überall (in allen klassen) verwenden
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Das mit einer Instanz ist ja ganz gut, und genau darauf will ich hinaus. Aber: Ich erzeuge also eine Instanz von logger. Alle Klassen die ihn benutzen bekommen einen Zeiger auf diese Instanz übergeben - umständlich und nicht gerade Anwendungsfreundlich - oder ich erzeug die Instanz $logger = new logger und greife dann in jeder Klasse über "global $logger" darauf zu, was den Code nicht gerade wiederverwertbar macht da die Klasse an einen festen Instanznamen gebunden ist.

                  Wenn ich mehrere Objekte habe auf die "global" zugegriffen wird muss ich entweder ein paar duzend Zeiger übergeben wenn ich ein neues Objekt erzeuge oder hab nen haufen Instanzen, auf die ich per global zugreife.

                  Wenn ich aber in jede meiner Klassen eine Methode implementiere die den Zeiger auf $logger weiterreicht und eine die ihn aus dem übergeordneten Objekt bei der Initialisierung "abholt" muss ich mir in Zukunft keine Gedanken mehr darum machen, welche Zeiger ich übergebe oder was auch immer, da sich mein Framework selbst darum kümmert - was soll daran jetzt blöd sein?
                  Cocoa Entwicklertraining - Alles für die Apfelzucht

                  Kommentar


                  • #10
                    [ ] du hast mal was von singleton gehört

                    (großer) tipp:
                    PHP-Code:
                    class singleton{
                      
                      var 
                    $instances = array();

                      function 
                    my_singleton() {}

                      function &
                    instance($class) {
                        if (!isset(
                    $this->instances[$class]) or !is_object($this->instances[$class]))
                          
                    $this->instances[$class] = new $class();
                        
                    $pointer = &$this->instances[$class];
                        return 
                    $pointer;
                      }
                    }

                    class 
                    dummy {
                      var 
                    $dummy 5;
                    }


                    $singleton = new singleton();
                    $a = &$singleton->instance('dummy');
                    $b = &$singleton->instance('dummy');

                    echo 
                    $a->dummy;
                    echo 
                    $b->dummy;
                    $a->dummy 7;
                    echo 
                    $a->dummy;
                    echo 
                    $b->dummy
                    mit php5 geht's eventuell eleganter

                    warum ist es eigentlich nicht elegant $logger als referenzvariable zu übergeben?
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      Das sieht nach nem sehr guten Tip aus - hab noch nie was von singleton gehört, werd ich auf alle Fälle mal benutzen.

                      Gruß
                      Cocoa Entwicklertraining - Alles für die Apfelzucht

                      Kommentar


                      • #12
                        Hey Danke nochmal,

                        ich habs mir jetzt mal genauer angeschaut, ist ja wirklich saugut. Ne saubere Möglichkeit "globale Objekte" zu verwalten, das werd ich auf alle Fälle einbauen.

                        Gruß Manfred
                        Cocoa Entwicklertraining - Alles für die Apfelzucht

                        Kommentar


                        • #13
                          du musst nur darauf achten, dass du $singleton nur ein einziges mal instanziierst, aber da fällt dir bestimmt was ein, dr muss man ja nicht alles vorkauen...
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar

                          Lädt...
                          X