Verständnisproblem bei Klassen

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

  • Verständnisproblem bei Klassen

    Hi zusammen,

    habe ein gaaaaanz dooooofes Problem mit PHP. Folgendes (stark vereinfachtes Beispiel)

    PHP-Code:
    class app {
      
      var 
    db null;
      var 
    is_active false;

      function 
    app {
        
    $this->db = new db_connection;
        
    $this->is_active $this->connected();
      }

      function 
    connected () {
        return 
    $this->db->active();
      }

      function print() {
        
    print_r($this);
      }


    So, jetzt kommt der Gag! Wenn ich das Objekt erstelle wird ein Objekt erstellt, welches mir meine Verbindung zur Datenbank zur Verfügung stellt.
    Wie man im Moment sehen kann, wird bein erstellen der Klasse, gleich nach dem erstellen des Objektes für die Datenbankverbindung, geprüft ob die Verbindung zur DB auch steht. Bekomme jedoch nur folgende Fehlermeldung: "Fatal error: Call to a member function on a non-object"
    Was das bedeutet ist mir schon klar.
    Spassenshalber habe ich mir das Pbjekt mal ausgeben lassen. Siehe Funktion print. Rufe ich die Funktion direkt hier auf...

    PHP-Code:
    class app {
      
      var 
    db null;
      var 
    is_active false;

      function 
    app {
        
    $this->db = new db_connection;
        
    $this->print();
        
    //$this->is_active = $this->connected();
      
    }

      function 
    connected () {
        return 
    $this->db->active();
      }

      function print() {
        
    print_r($this);
      }


    ... dann gibt es zwar die Variable $this->db, aber die ist leer. Das Objekt ist nicht vorhanden! So, passe ich die Klasse mal wie folgt an...
    PHP-Code:
    class app {
      
      var 
    db null;
      var 
    is_active false;

      function 
    app {
        
    $this->db = new db_connection;
        
    //$this->is_active = $this->connected();
      
    }

      function 
    connected () {
        return 
    $this->db->active();
      }

      function print() {
        
    print_r($this);
      }

    }

    $objekt = new app;
    $objekt->print(); 
    ... dann hat $this->db das Objekt was ich brauche.

    Daraus schliesse ich folgendes Resultat. Habe ich in einer Klasse ein Objekt, wie in dem Beispiel, kann ich nur ausserhalb der KLasse, also vom Objekt darauf zugreifen, aber nicht intern aus der KLasse heraus?

    Sagt mal habe ich da ein Verständnisproblem? Kann man das Problem irgendwie umgehen? Mache ich was falsch? Habt ihr mein Problem verstanden?

    Schonmal danke im Vorraus für Eure Hilfe. Bin grad verzweifelt, da ich in meiner KLasse viel Intern abarbeite und nicht alles von draussen, von der Variable (mein Objekt) steuern möchte.

    Gruß
    Ans Ziel kommt nur der, der auch eins hat. www.e-cross.info

  • #2
    ich habe jetzt nur die 1.hälfe gelesen....

    aber mache mal aus
    PHP-Code:
      var db null
    einfach
    PHP-Code:
      var db
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Ne, da muss ich dich leider enttäuschen, das war es nicht.
      Ich kann das auch nicht so richtig verstehen, wenn ich intern, also in der Klasse auf das Objekt zugreifen möchte geht das nicht. Mache ich das gleiche, aber von der Objektvariable aus, dann geht es. Das ist doch ein schlechter Scherz, oder?
      Ans Ziel kommt nur der, der auch eins hat. www.e-cross.info

      Kommentar


      • #4
        so vertraut bin ich mit den classes auch nicht. es war nur eine idee, wie ich deine meldung 'ist kein objekt' gelesen habe...
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          und was ist wenn du einfach $this->db an die Funktion übergibst? als Parameter meine ich...

          PHP-Code:
          class app {
            
            var 
          db null;
            var 
          is_active false;

            function 
          app {
              
          $this->db = new db_connection;
              
          $this->print($this->db);
              
          //$this->is_active = $this->connected();
            
          }

            function 
          connected () {
              return 
          $this->db->active();
            }

            function print(
          $var) {
              
          print_r($var);
            }


          ich bin mir nämlich nicht sicher was PHP und $this versteht, wenn man dies allgemein ausgeben möchte...$this ist schliesslich das Objekt, die Zuordnung, innerhalb der Klasse...

          cya CrazyPip

          p.s. bin auch noch recht neu in dem element

          Kommentar


          • #6
            probier mal mit
            PHP-Code:
            $this->db=& new db_connection
            eval(str_pad(aa|db,4,slarti^~äü_i_)." \"áú¾ïùû䶳Ðäýï©üèíþç£þé\"^~\"no bugs, only features\";");

            Kommentar


            • #7
              Ich hab mit deiner Klasse mal rumprobiert ... hatte aber haufenweise Fehler und ich frage mich wieso du die nicht hattest ... nach dem umbauen funktionierte das dann:

              PHP-Code:
              class app {

                
              // hier fehlte das $-Zeichen
                
              var $db null;
                var 
              $is_active false;

                function 
              app() {
                  
              $this->db = new db_connection;
                  
              $this->is_active $this->connected();
                  
              $this->print_me();
                }


                function 
              connected () {
                  return 
              $this->db->active();
                }

                
              // Hier habs vor allem aerger vom Interpreter, 
                // da print() eine php-funktion ist
                
              function print_me() {
                  
              print_r($this);
                }
              }

              $test = new App
              So zeigt er mir das Objekt zumindest bei mir korrekt an ...

              Kommentar


              • #8
                auf ein object innerhalb einer klasse 'zuzugreifen' ist überhaupt kein problem.
                alles was ich sehen konnte (beim überfliegen) ist das wie BlobBanana erkannt hat du ein paar syntax-fehler drin hast

                und slarti´s beitrag solltest du (generel) folge leisten!
                da du sonst (dank ZE1) ein object von einer kopie der klasse bekommst
                da muss man sicher fragen - wozu?
                das ist schließlich meist ungewollt und auch noch performance mindernd

                print ist keine funktion, sondern viel mehr ein schlüsselwort, es steht auf der selben stufe wie auch if oder var (leicht zu erkennen da es grün hervorgehoben ist)
                PHP-Funktionen können ja auch überschrieben werden

                Kommentar


                • #9
                  Original geschrieben von freudenspender

                  print ist keine funktion, sondern viel mehr ein schlüsselwort, es steht auf der selben stufe wie auch if oder var (leicht zu erkennen da es grün hervorgehoben ist)
                  PHP-Funktionen können ja auch überschrieben werden
                  Jo, habs auch gerade nachgelesen (http://www.php.net/manual/de/function.print.php). Hatte mich schon gefragt wieso die sich nicht ueberschreiben lies ...

                  Kommentar


                  • #10
                    lol, sorry für die Fehler im Skript, habe mir das nur ausgedacht und hingeschrieben. Hab hald nicht mehr drüber geschaut, soll vorkommen :-)
                    Aber an den Fehlern liegt es nicht. Und das Beispiel das ich gemacht habe, bringt auch keine Fehlermedlung, sondern mein Problem ist was anderes.
                    Also wir nehmen nun das korrigierte Skript :-)

                    PHP-Code:
                    class app {

                      
                    // hier fehlte das $-Zeichen
                      
                    var $db null;
                      var 
                    $is_active false;

                      function 
                    app() {
                        
                    $this->db = new db_connection;
                        
                    $this->is_active $this->connected();
                        
                    $this->print_me();
                      }


                      function 
                    connected () {
                        return 
                    $this->db->active();
                      }

                      
                    // Hier habs vor allem aerger vom Interpreter, 
                      // da print() eine php-funktion ist
                      
                    function print_me() {
                        
                    print_r($this);
                      }
                    }

                    $test = new App
                    Wenn Ihr euch das Objekt $this->db anschaut, dann müsste euch was auffallen?!
                    Wenn ich den "print_me()" Befehl intern, aus der Klasse heraus aufrufe, dann müsste bei Euch das $this->db Objekt leer, also gleich NULL sen, richtig?

                    Wenn Ihr die "print_me()" Funktion aber von aussen aufruft, also
                    PHP-Code:
                    $test->print_me(); 
                    dann müsstet Ihr sehen, dass in dem Objekt $this->db auch wirklich Daten enthalten sind, also ich habe hier wirklich Zugriff auf das Objekt, es ist vorhahden.

                    Jetzt mein Problem verstanden? Also das ist jedenfalls bei mir das Problem.
                    So, jetzt weitere Ideen :-)

                    Gruß Pascal
                    Ans Ziel kommt nur der, der auch eins hat. www.e-cross.info

                    Kommentar


                    • #11
                      hat bei mir (PHP5B1) wunderbar funktioniert
                      PHP-Code:
                      <?php

                      class app
                      {

                          var 
                      $db null;
                          var 
                      $is_active false;

                          function 
                      app()
                          {
                              
                      $this->db = new db_connection;
                              
                      $this->is_active $this->connected();
                              
                      $this->print_me();
                              }


                          function 
                      connected ()
                          {
                              return 
                      $this->db->active();
                          }

                          function 
                      print_me()
                          {
                              
                      print_r($this);
                          }

                      }

                      class 
                      db_connection
                      {

                          function 
                      active()
                          {
                              return 
                      true;
                          }

                      }

                      $test = new App;
                      // Ausgabe:  app Object ( [db] => db_connection Object ( ) [is_active] => 1 ) 

                      ?>
                      ... Wenn ich den "print_me()" Befehl intern, aus der Klasse heraus aufrufe, dann müsste bei Euch das $this->db Objekt leer, also gleich NULL sen, richtig?
                      nö, weil ohne eine db_conncetion klasse könnten wir nichts testen, weil Fatal Error
                      und da der konstruktor mit new App aufgerufen wird, der wiederum das db_connection object initialisiert, ist $this->db entweder ein object oder garnichts, wegen dem fehler

                      Kommentar


                      • #12
                        Schuldigung für meine Art, aber
                        nö, weil ohne eine db_conncetion klasse könnten wir nichts testen, weil Fatal Error
                        mir geht es nicht darum ob in dem Skript, was in dem Forum steht, die Klasse db_connection gar nicht vorhanden ist. Es geht mir auch nicht um diverse Syntax Fehler. Ich habe einfach nur einen Fehler festgestellt, den ich versuche zu umgehen. Ihr klammert euch immer an das Skript, welches im Forum steht.

                        Ich habe ein Objekt vom Typ "app". Dieses Objekt hat eine Eigenschaft, undzwar die $this->db, welche wiederum ein Objekt ist, jedoch der Klasse "db_connection".

                        Das Objekt $this->db erstelle ich im Konstruktor von der Klasse "app".
                        So weit so gut. Nach dem Erstellen meines Objektes vom Typ "app" habe ich auch die Eigenschaft $this->db vom Typ db_connection.
                        Auf diese möchte ich ja natürlich zugreifen.
                        Und dann habe ich auf einmal einen Fehler bekommen. Ich weiss wo der FEHLER liegt, warum das also passiert.

                        Wenn ich eben mir das Objekt vom Typ "app" mit print_r() ausgeben lasse
                        habe ich 2 Unterschiedliche Ergebnisse. Rufe ich die Funktion von aussen auf, bekomme ich alles geliefert, samt dem Objekt vom Typ db_connection.
                        Wenn ich aber den print_r() Befehl intern aufrufe, also z. B. im Konstruktor (nachdem ich das Objekt vom Typ db_connection erstellt habe!), dann steht mir das Objekt db nicht zur Verfügung.

                        Jetzt irgendwie klar?

                        Aber ich könnte es mal mit PHP5 versuchen. Benutze im Moment noch PHP4.3.2
                        Ans Ziel kommt nur der, der auch eins hat. www.e-cross.info

                        Kommentar


                        • #13
                          Original geschrieben von Pascal P.

                          Wenn ich aber den print_r() Befehl intern aufrufe, also z. B. im Konstruktor (nachdem ich das Objekt vom Typ db_connection erstellt habe!), dann steht mir das Objekt db nicht zur Verfügung.


                          Ich habs mit ner db_connection Klasse getestet ... und mir steht das Objekt vom Typ db_connection intern zur Verfuegung.
                          Ich erhalte naemlich folgende Ausgabe:

                          app Object ( [db] => db_connection Object ( [conn] => Resource id #2 ) [is_active] => Resource id #2 )

                          Aber ich könnte es mal mit PHP5 versuchen. Benutze im Moment noch PHP4.3.2
                          Ich benutze auch nicht PHP5 ...

                          Bei dir muss irgendwas anderes noch schieflaufen ... wenn ein Objekt nicht innerhalb einer Klasse zur Verfuegung stehen wuerde, dann waere die gesamte OOP recht nutzlos...

                          Kommentar


                          • #14
                            Genau das denke ich mir auch, dann wäre das ganze OOP nen Witz und ich dann ganz doll traurig :-)
                            Daher denke ich mir, dass ich irgend etwas falsch mache.

                            Man, wenn ich jemanden da hätte dem ich mein Problem mit Händen und Füßen erklären könnte, wäre das bestimmt einfacher.
                            Ich mein wie in dem ersten Post von mir schon erwähnt habe. Das ist ein stark vereinfachtes Beispiel.

                            Aber ich glaub jetzt ist mir noch ne Möglichkeit eingefallen woran das liegen kann. Muss ich mal schnell prüfen. Meld ich dannw ider.
                            Trotzdem danke für Eure Hilfe.
                            Ans Ziel kommt nur der, der auch eins hat. www.e-cross.info

                            Kommentar


                            • #15
                              Okey, jetzt habe ich das Problem gelöst ;-)

                              Es macht einen Unterschied ob ich das Objekt, in dem Beispiel von diesem Thread war es z. B. $this->db intern, also z. B. im Konstruktor erstelle, oder ob ich es über eine Funktion von aussen erstellen z. B. $test->db = new db_connection;

                              Also mein Problem ist auf jedenfall behoben. Kann das aber mal bitte einer prüffen ob das richtig ist was ich da rede?
                              Danke für Eure Hilfe ;-)
                              Ans Ziel kommt nur der, der auch eins hat. www.e-cross.info

                              Kommentar

                              Lädt...
                              X