Klassen und Variablen

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

  • Klassen und Variablen

    Hi,

    ich habe 2 Klassen:

    PHP-Code:
      //Datei foo.php
      
    class foo
      
    {
        var 
    $test 'Guten Morgen';

        function 
    changeTest()
        {
          
    $this->test "Es ist nun Abend";
          
    //require_once('bar.php');
          
    $class2 = new bar;
          
    $class2->beispiel();
        }
      }

      
    //Datei bar.php
      
    class bar extends foo
      
    {
        function 
    beispiel()
        {
          echo 
    $this->test.'...';
        }
      }
      
      
    //Datei main.php
      
    $class1 = new foo;
      
    $class1->changeTest(); 
    Wie man sieht, lasse ich die 2. Klasse in der ersten Klasse aufrufen.

    Vielleicht habe ich ja etwas grundlegendes falsch verstanden, aber ich möchte gerne, dass die 2. Klasse, bar, die geänderte Variable von Klasse 1, foo, übernimmt.

    Er soll mir also "Es ist nun Abend" ausgeben und nicht "Guten Morgen"!

    Muss ich etwa alle Variablen mit übergeben bzw. neu definieren?
    Dann bringt mir das extends ja gar nichts!


    Wäre über jegliche hilfreiche Aufklärung dankbar

  • #2
    ja, die vererbung solltest du dir nochmal genauer anschauen...

    nach deiner deklaration enthält die klasse bar eine eigenschaft der oberklasse, nämlich $test. ihr inhalt ist ganz klar festgelegt. die methode beispiel() gibt also ganz wie erwartet diese eigenschaft aus.

    die methode changeTest() dagegen verändert die eigenschaft eines objektes vom typ foo.

    jetzt klar?

    Kommentar


    • #3
      auf jedenfall verständlicher.

      Nur eines möchte ich noch wissen:

      Ich deklariere Klasse "bar" immer nur in Klasse "foo", niemals wo anders!

      Theoretisch könnte ich ja dann per Klassenname von foo auf deren geänderte Werte zugreifen:

      in Klasse bar: echo $class1->test, anstatt $this->test

      Gibt es eine Möglichkeit, den Klassennamen $class1 so global zu definieren, wie $this?
      Also dass wenn man die Klasse anstatt $class1 einfach $mysqldb nennt, dies dann immernoch funktioniert?
      _________________________________________

      Andere Möglichkeit wäre: Gibt es noch weitere solcher klassenglobaler Zugriffsmöglichkeiten wie $this? also z.B. $this_class_parent oder so?
      _________________________________________

      Ich ändere einen Zugriffspfad in meiner Hauptklasse, dieser muss dynamisch sein, wegen Modulen und Ordnerpfaden!
      Klasse foo sucht das Cache-Template! Ist es nicht vorhanden, startet bar und sucht das Template, haut die Sprachvariablen rein und speichert das Cache-Template.
      Wegen den Modulen ändert sich der Pfad von den Templates je nach Modul! Aber es ändern sich insgesamt 10 Variablen.
      Theoretisch könnte ich sie alle beim Deklarieren übergeben, aber das erscheint mir irgendwie nicht "sauber".

      Wisst ihr weiter?

      Vielen Dank

      Kommentar


      • #4
        versuchs mit
        PHP-Code:
          class bar extends foo
          
        {
            function 
        beispiel()
            {
              echo 
        parent::test.'...';
            }
          } 
        den letzten teil deiner frage habe ich gar nicht verstanden.

        Kommentar


        • #5
          Hi,

          danke für den Tipp, aber jetzt kommt nur noch:

          Fatal error: Undefined class constant 'test' in L:\Daten\gewerbe\test.php on line 21

          Und die Fehlermeldung findet er hier im Forum nicht. Hab schon gegoogelt, aber nichts nennenswertes gefunden!

          ---------

          Der untere Teil war eine Erklärung, für was ich es brauche... Aber das Beispiel ist ja sehr anschaulich.

          ---------


          Ich habe jetzt ein bischen rummgespielt und festgestellt, dass man mit parent:: nur Funktionen aufrufen kann und mir eben so eine geschrieben:

          PHP-Code:
              function get_var($string){
                eval(
          '$s = $this->'.$string.';');
                return 
          $s;
              }
              echo 
          parent::get_var('test'
          Nur leider gibt mir diese Funktion ebenfalls den "hart" eingetragenen Wert zurück!

          Kommentar


          • #6
            stimmt, mein fehler.

            im grunde sollte man einen selektor benutzen:
            PHP-Code:
            class a
            {
              var 
            $xx "bla";
              
              function 
            getXx()
              {
                return 
            $this->xx;
              }
            }

            class 
            extends a
            {
              function 
            b()
              {
                echo 
            parent::getXx();
              }
            }

            $b = new b
            eval() ist i.d.r. mit abstand die schlechteste lösung.
            wenn du viele variablen erreichen musst, benutze ein array und übergib dem getter den schlüssel per parameter.

            Kommentar


            • #7
              Hi,

              deine Lösung funktioniert auch nicht wirklich:

              PHP-Code:
                class a
                
              {
                  var 
              $xx "bla";
                  
                  function 
              a(){
                    
              $this->xx 'Hallihallo';
                  }
                  
                  function 
              getXx()
                  {
                    return 
              $this->xx;
                  }
                }
                
                class 
              extends a
                
              {
                  function 
              b()
                  {
                    echo 
              parent::getXx();
                  }
                }
                
                
              $b = new b
              Er gibt mir immer nur "bla" aus!
              Ich glaube, es bleibt mir nichts anderes übrig, als die ganzen Variablen als array zu übergeben...

              MIST

              Kommentar


              • #8
                wie auch - der konstruktor a() wird ja auch nie aufgerufen...

                Kommentar


                • #9
                  Hmmmm....

                  Stimmt, ok, aber das tut nichts zur sache!

                  PHP-Code:
                  <?php
                    
                  class a
                    
                  {
                      var 
                  $xx "bla";
                      
                      function 
                  a(){
                        echo 
                  $this->xx 'Hallihallo<br>';
                      }
                      
                      function 
                  getXx()
                      {
                        return 
                  $this->xx;
                      }
                    }
                    
                    class 
                  extends a
                    
                  {
                      function 
                  b()
                      {
                        echo 
                  parent::getXx();
                      }
                    }
                    
                    
                  $a = new a;
                    
                  $b = new b;
                  ?>
                  so gibt er mir immernoch
                  Hallihallo
                  bla
                  aus, anstatt 2x Hallihallo!

                  Warum geht das nicht?

                  Kommentar


                  • #10
                    weil parent auf die klasse verweist. und in der klasse existiert die eigenschaft nur mit dem standard-wert.

                    die veränderung wird in einer instanz der klasse ausgeführt und hat keine auswirkung auf die klasse.

                    Kommentar


                    • #11
                      versuch mal dein anliegen noch mal in klartext zu fassen, was genau willst du erreichen?

                      Kommentar


                      • #12
                        Ich habe eine Template-Aufruf-Klasse und eine Template-Generier-Klasse!

                        Ich definiere die Template-Aufruf-Klasse. Diese prüft, ob das Cache-Template existiert und ruft es auf.
                        Existiert es nicht, so wird die Template-Generier-Klasse deklariert und erstellt das Cache-Template!

                        Mein Problem ist hierbei, dass der Pfad zu den Ur-Templates, aus denen die Cache-Templates erstellt werden, in der Template-Aufruf-Klasse definiert und geändert werden kann.
                        Nun sollte die Template-Generier-Klasse diesen Pfad für das erstellen des fehlenden Templates logischerweise übernehmen.

                        Es muss aber nicht nur der Template-Pfad, sondern auch der Cache-Pfad, Sprachen-Pfad, die aktuelle Sprache, etc. übergeben werden!

                        Und da hänge ich gerade, denn er nimmt immer die Grundeinstellungen der Template-Aufruf-Klasse!

                        Kommentar


                        • #13
                          sorry, ich blicke da echt nicht durch. habe gehofft, dass du mir erklärst, was du mit klassen und deren eigenschaften vorhast. deine template-geschichten sind mir zu speziell.

                          Kommentar


                          • #14
                            Naja, mal ganz kurz gesagt:

                            In Klasse 1 möchte ich eine Klassenvariable neu definieren und dieser neue Wert soll von Klasse 2 auslesen werden, ohne dass er als Paramter in der Funktion übergeben wird.

                            Verständlich?

                            Kommentar


                            • #15
                              dann brauchst du entweder eine globale variable (i.d.r. eine suboptimale lösung) oder du überlegst dir folgendes: die veränderung geschieht ja nicht in der ersten klasse, sondern nur in einer instanz. die klasse bleibt, wie sie ist. drum sieh zu, dass du aus einer instanz der zweiten klasse auf die veränderte eigenschaft der instanz der ersten zugreifst. den verweis auf diese kannst du per parameter übergeben (byref, versteht sich).

                              Kommentar

                              Lädt...
                              X