klassen innerhalb von klassen verwenden

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

  • klassen innerhalb von klassen verwenden

    Ihr kennt bestimmt das Problem, man hat ein paar nette klassen gebaut, möchte dieser aber innerhalb einer anderen klasse verwenden.
    man kann keinen :: operator verwenden weil man ein objekt braucht.
    extend geht auch nicht weil man nicht mehrfach extenden kann.. (Mutter->Kind geht, Mutter->Kind->enkel geht nicht)

    jetzt die frage, was ist die stilistisch beste Möglichkeit andere Objekte innerhalb eines Objekts zu benutzen?

    ein paar Möglichkeiten die mir bisher unterbreitet wurden mal hier:

    global $objekt;
    // wäre wohl stilistisch nicht das wahre, zudem scheint es bei mir nicht zu funktionieren.

    innerhalb einer methode ein neues objekt erstellen, verwenden und unsetten oder gegebenenfalls als var deklarieren.
    (man könnte ja zum beispiel einen zweiten, dritten, etc .. "konstruktor" für die klassen machen, die man braucht.)

    als referenz überliefern
    einer methode, oder dem konstruktor als referenz ein bestehendes objekt überliefern.
    wäre glaube ich die beste methode, da man keinen overhead erzeugt durch überflüssige doer doppelt deklarierte klassen.

    was geht noch .. ?

  • #2
    Re: klassen innerhalb von klassen verwenden

    Original geschrieben von rythms
    man kann keinen :: operator verwenden weil man ein objekt braucht.
    ach?
    extend geht auch nicht weil man nicht mehrfach extenden kann.. (Mutter->Kind geht, Mutter->Kind->enkel geht nicht)
    echt?

    so vererben kannst du, fragt sich bloß, ob das sinnvoll ist...
    wenn du von mutter ü+berkind zu enkel ne fortwährende spezialisierung hast,dann ja
    wenn's dir nur drum geht, die funktionalität von mutter auchinenkel nutzen zu können, is das keine spezialisierung und daher würd ichdas auch nicht vererben sondern mit ner referenz machen

    die variante mit referenzen gefällt mir persönlich am besten, da hast du natürlich in deiner klassendeklaration ne objektvariable, die diese referenz aufnimmt
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      ich wollt's ja nur verdeutlichen

      Es wäre ja nicht der sinn einer klasse die alle zu vererben, ich will ja nicht meine sql klasse mit meiner foren klasse o.ä. zusammen haben ..

      also mit referenzenis dann wohl die beste lösung..

      Kommentar


      • #4
        tja, funktioniert nur leider nicht wirklich, da php eine kopie der referenz erstellt und nicht die referenz selber benutzt ..

        erst in php5 ist dies der fall.

        Kommentar


        • #5
          $obj =& new Classname;

          willst du sowas ??

          es gibt ne möglichkeit, ne klassenhierarchie aufzubauen, so wie du es willst...

          du willst doch sowas:
          Mutter->Kind->enkel

          mal vereinfacht:
          class Mutter;

          class Kind extends Mutter;

          class Enkel extends Kind;

          oder hab ich da jetzt was falsch verstanden ?

          gruss

          Kommentar


          • #6
            eigentlich geht es mir darum, dass ich jedwedige klasse in einer anderen verwenden kann, inklusive korrektem zugriff auf die methoden/eigenschaften.
            mit extends ist es nicht getan.

            nehmen wir mal an:
            ich habe eine error klasse.
            sie speichert mittels methode eine fehlermeldung in einer eigentschaft (array).
            diese klasse deklariere ich ganz normal.

            dann habe ich zwei andere klasse, die diese klasse benutzen um fehlermeldungen zu speichern.

            diese fehlermeldungen werden im nachhinein von der error klasse ausgegeben.

            dazu übergebe ich die error klasse als referenz an den konstruktor der beiden anderen klassen.

            da php hier jetzt eine kopie erstellt und nicht die referenz benutzt (was laut manual performancetechnisch nichts ausmacht) habe ich im endeffekt dreimal die error klasse, aber die jeweiligen fehlermeldungen der beiden klassen sind in der zur klasse gehörigen kopie der error klasse.

            also kann ich mit meiner ürsprünglichen error klasseninstanz nicht die in den beiden anderen klassen gespeicherten fehlermeldungen ausgeben.

            Kommentar


            • #7
              so nicht direkt, das ist richtig...

              aber über einen umweg geht es...

              du brauchst eine klasse, die dir ein objekt erstellt...

              über diese klasse instanziierst du alle anderen klassen (methode) und übergibst die objekte als referenz beim instanziieren gleich weiter...

              auf diese art hast du folgendes ergebnis...

              $objBasis (basisklasse, die die anderen klassen instanziiert)
              $objChild1

              machst du jetzt ein print_r($objBasis) hast du das objekt $objChild als referenz

              und machst du ein print_r($objChild1) hast du alle methoden der klasse ($objBasis) zur verfügung...

              meinst du sowas ??

              gruss

              Kommentar


              • #8
                wenn du ne refernz übergibst, warum macht php ne kopie?
                PHP-Code:
                class a
                {
                  var 
                $error;

                  function 
                a(&$error)
                  {
                    
                $this->error=&$error;
                  }
                }

                class 
                b
                {
                  var 
                $error;

                  function 
                b(&$error)
                  {
                    
                $this->error=&$error;
                  }
                }

                $err=&new error();

                $a=new a($err);
                $b=new b($err); 
                Zuletzt geändert von mrhappiness; 06.11.2003, 13:46.
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  @Happy:

                  in deinem Beispiel macht er eine Kopie
                  du mußt in der Funktion auch eine Referenz annehmen!

                  PHP-Code:
                  function a( & $error
                  TBT

                  Die zwei wichtigsten Regeln für eine berufliche Karriere:
                  1. Verrate niemals alles was du weißt!


                  PHP 2 AllPatrizier II Browsergame

                  Kommentar


                  • #10
                    korrigiert, ich werd alt, da kommt sowas schon mal vor
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      hy... also ich mache es nach der method hier und es funzt wunderbar

                      PHP-Code:
                      <?php

                      class db
                      {
                          function 
                      db()
                          {
                          }

                          function 
                      sql_query()
                          {
                          }
                      }

                      class 
                      dbum
                      {
                          var 
                      $db;
                          
                      // Constructor bekommt nur die Referenz von object db
                          
                      function dbum(&$db)
                          {
                              (!
                      is_object($db)) $this->db FALSE $this->db $db;
                          }

                          function 
                      login()
                          {
                              
                      $res $this->db->sql_query("SELECT bla bla bla");
                          }
                      }


                      $db = new db();

                      $db->sql_query("UPDATE bla bla bla")


                      $dbum = new dbum($db);

                      $dbum->login($_POST["user"] , $_POST ["pass"]);

                      // Object DB immer noch nutzbar
                      $db->sql_query();


                      ?>

                      Kommentar


                      • #12
                        was hat Happy denn gerade geschrieben

                        außerdem machst du hier
                        PHP-Code:
                        $db = new db(); 
                        gerade eine Kopie.
                        Schreibe dies mal als
                        PHP-Code:
                        $db = & new db(); 
                        TBT

                        Die zwei wichtigsten Regeln für eine berufliche Karriere:
                        1. Verrate niemals alles was du weißt!


                        PHP 2 AllPatrizier II Browsergame

                        Kommentar


                        • #13
                          mortalan's weg war das gesuchte denk ich mal ..
                          allerdings wird auch dort eine kopie erstellt, allerdings dadurch angeglichen, dass in den "kind"objekten auch $this verwendet wird wenn ich etwas in einer variable speicher und dies dann nicht im kindobjekt liegt, sondern im basisobjekt.

                          eventuell werd ich das ganze morgen mal testen und dann code & print_r ergebnisse posten.

                          trotzdem wart ich da lieber einfach auf php5, dann geht das ganze sauberer.

                          Kommentar


                          • #14
                            wenn du meinen (korrigierten) vorschlag nimmst, hast du überall ds gleiche objekt, da du überall mit referenzen gearbeitet hast...
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              japp... entweder mrhappies vorschlag oder meinen richtig umgesetzt... wobei meiner umständlicher ist, da du alles über ein basisobjekt machst, meine lösung aber halt für meine Anforderungen entwickelt ist...

                              kann halt auch intern objekte tauschen und überschreiben und methoden zwischen klassen hin und herschieben, da alles über die basisklasse registriert ist

                              Kommentar

                              Lädt...
                              X