OOP mit php 4

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

  • OOP mit php 4

    Erst mal, Hallo alle zusammen.

    Ich bin neu here und hoffe auf ein paar Tipps.

    Bisher habe ich mit php sequentiell programmiert, obwohl ich denke, dass ich das schon mal gut gemacht hatte, denn ich war immer bedacht den View von Logik zu trennen. Alle meine Funktionen lagen separat und in den View-Dateien, gab es nur die Aufrufe der Funktionen. Seit einieger Zeit versuche ich auf OOP umzusteigen. Mein Problem ist - ich finde kaum gute Erklärungen (Tutorials) dazu. Meistens berichten die Tutorials von einer Auto Klasse, erzeugen das Objekt, greifen auf die Methoden oder Eigenschafte ein und das war's. Es ist mir zu wenig. Ich suche irgend ein Tutorial, dass ein wenig tiefer eingreift, leider die, die ich gefunden habe waren so abstrakt, dass es schwer zu verstehen war (für jemand der bisher sequentiell gearbeitet hat )

    Gibt es irgend ein Tutorial, das mir jemand empfehlen kann?

    Ich habe früher nämlich ganz viel Theorie zu OOP gelernt, aber die Praxis fehlt. Und nun stehe ich da und überlege, wie nach den OOP-Programmier-Regeln es eigentlich richtig wäre. Wenn ich in einer Klasse auf die Methoden einer anderen Klasse zugreifen möchte. Erzeuge in der zweiten Klasse ein Objekt der ersten. Oder erzeuge ich ein Objekt der ersten Klasse im View und übergebe an den Constructor der zweite Klasse als Referenz. Was ist hierfür besser oder besser gesagt: was ist richtig?

    Ich bin für jeden Tipp sehr dankbar.
    Ich habe nämlich alle möglichen Konstellationen ausprobiert und jede davon funktioniert - welche ist aber die richtige?
    Xdevel

  • #2
    Nabend,

    Wichtig in der OOP ist die Kapselung, dass heißt, dass du Informationen und Methoden strikt nach Zusammengehörigkeit verpackst, so hätte die Methode Klingeln() nichts in einer Autoklasse verloren und die Methode Hupen eben nichts in einer Fahrradklasse.

    Das heißt, du greifst in der Regel NICHT auf die Methoden einer anderen Klasse zu mit einem Objekt. Eine Klasse sollte alle Funktionen die es zur Bearbeitung ihrer Objekte benötigt bereitstellen.

    Es kann (um auf dein Problem einzugehen) vorkommen, dass du eine Klasse hast, welches Methoden bereitstellt um mit Objekten andere Klassen zu arbeiten. Dabei ruft das Objekt aber keine Methoden einer anderen Klasse von sich aus auf.
    Ob du das per Parameterübergabe machst oder durch erzeugen eines Exemplars inerhalb der Klasse ist abhängig davon, was du brauchst.

    Ein guter Einstieg in OOP ist es, sich eine eigene Datenbankklasse zu schreiben. Da hast du etwas, dass du gleich anwenden kannst.

    Gruß Thomas
    Zuletzt geändert von Alrik; 31.01.2006, 08:01.

    Kommentar


    • #3
      Wirklich keine Ideen?

      Sorry, ich weiß, ich bin ungeduldig. Ich brauche einfach die Antwort dringend.
      Xdevel

      Kommentar


      • #4
        Original geschrieben von Alrik
        Nabend,

        ......

        Ein guter Einstieg in OOP ist es, sich eine eigene Datenbankklasse zu schreiben. Da hast du etwas, dass du gleich anwenden kannst.

        Gruß Thomas
        Hi Thomas,
        Du redest mir von der Seele

        Das alles möchte ich genau ergründen. Mein Problem ist - ich kenne die Theorie, aber bei der Praxis happert.

        Und genau mit eine mysql Klasse habe ich angefangen. Und habe mir eine Connection Klasse gebaut. Und danach eine Author Klasse die alle Authoren von Büchern ausgeben soll. Nun dachte ich, die Author-Klasse darf doch nicht von der Connection-Klasse erben, weil es 2 verschiedene paar Schuhen sind
        Aber ich brauche ja die DB-Connection um die verschiedenen Abfragen bei der Author-Klasse zu realisieren.

        Nun kommst Du
        Xdevel

        Kommentar


        • #5
          Also das ist wieder eine Sache, wie du die Autorenklasse aufgebaut hast.
          Hast du eine Methode wie: get_books($author), dann würde ich innerhalb der Autorenklasse ein Exemplar der Mysql-Klasse erzeugen.
          Das hat aber den Nachteil, dass du Änderungen an der Datenbank (neuer Server etc.) auch in der Autorenklasse erledigen musst.

          Inwieweit nun wiederum diese Autorenklasse sinvoll ist, vermag ich nicht zu sagen ohne den Code zu kennen, bzw die Aufgaben der Klasse.

          Kommentar


          • #6
            Aaaa

            Ich erkenne es, ich habe jetzt jemand an dem Hacken

            Sorry, nicht böse sein, ich bin immer so direckt

            Also:

            Ich habe eine Datenbank mit Authoren und Büchern. Jede Menge (gesunde) Beziehungen dazwischen (ich kann Datenbanken ganz gut).
            Und nun eine ganz einfache Aufgabe: Ich möche alle Authoren und dazu gehörigen Bücher ausgeben. Aber die Connection Klasse ist eine, und die Author Klasse eine andere, da nach der OOP-Regeln würde ich bei den beiden keine Vererbung verwenden wollen.

            Aber ich muss ja irgendwie bei der Author-Klasse die Datenbank-Verbindung haben um die auf die Datenbank zugreifen zu können. Und nun ist die Frage welche Lösung ist die richtige. Ein Connection-Objekt in der Author-Klasse oder eine übegebene Referenz des "Connection-Objekts" in der View-Klasse (hierbei meine ich einfach die php-Datei, die eine Liste der Authoren ausgibt.)

            Meine Klassen (vereinfacht dargestellt)
            PHP-Code:
            class MySQLConnector{
              ....
            }

            class 
            Author{
              var 
            $db=NULL;

               
            //constructor
              
            function Author(){
                 
            //options is ein Array mit username, password, etc.
                
            $this->db = new MySQLConnector($options);
              } 

               function 
            getAuthorList(){
                   .....
               }

            oder

            PHP-Code:
            class Author{
              var 
            $db=NULL;
               
               
            //constructor
              
            function Author(&$db){
                 
            $this->db = &$db;
              } 

               function 
            getAuthorList(){
                   .....
               }

            und in der View-Datei:
            PHP-Code:
            $options = array('host'=>'localhost''user'=>'xxx''password'=>'xxx''database'=>'books');
            $db = new MySQLConnector($options);
            $author = new Author($db);
            $authorList $author->getAuthorList(); 
            Xdevel

            Kommentar


            • #7
              Also eine richtige Lösung gibt es in solchen Fällen nicht, aber es gibt gute und schlechte Designs.

              Ich persönlich würde das über die view.php regeln. Es spricht aber auch nichts dagegen, die DB innerhalb der Autor Klasse zu erzeugen, spiel einfach mit den Möglichkeiten rum, und du wirst sehen was dir besser gefällt.

              Aber ich weiß immer noch nicht genau, was du mit deiner Autoren Klasse bezwecken möchtest!?
              Ich vermute mal, du brauchst eher eine Klasse, die sich um Datenobjekte kümmert, als um Autoren im speziellen?
              Oder besitzt deine Klasse Autoren spezielle Methoden wie schreibe_Buch($genre) ?

              Ich versuche dafür zu sorgen, dass sich meine Klassen nicht kennen und diese nur über ihre Schnittstellen kommunizieren können.

              Das Auslesen der Autoren ist sicherlich eine Aufgabe der Mysql Klasse und nicht die der Autoren Klasse.
              Deine Autoren Klasse sollte aber das Array, was du aus deiner Anfrage erhälst aufnehmen können und weiterverarbeiten.

              €: noch ein wenig Pseudocode zum Verständnis:
              Code:
              $mysql = new Mysql($option);
              $mysql->query(lade mir den autor);
              $datenarray = $mysql->fetchArray();
              
              $autor = new Autor($datenarray);
              $autor->machwasmitdaten();
              Zuletzt geändert von Alrik; 30.01.2006, 22:26.

              Kommentar


              • #8
                Original geschrieben von Xdevel
                oder
                ich denke, dass ist es was du eigentlich willst. eine referenz des db-objektes.

                das hat den vorteil, dass du immer nur diese eine instanz der db-class hast. egal welche und wieviele andere classes das db-objekt nutzen wollen/sollen.

                wenn du z.b. alle queries beim aufbau einer seite messen willst, kommst du um diese referenz nicht drumrum. du willst ja alle aufrufe der query-methode zählen und nicht für jede instanz einzeln.
                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


                • #9
                  Original geschrieben von Alrik
                  Das heißt, du greifst in der Regel NICHT auf die Methoden einer anderen Klasse zu mit einem Objekt.
                  könntest du bitte mal ein wenig näher erläutern, was du damit genau meinst? so, wie du es formuliert hast, ist es nämlich völliger schwachsinn, wenn ich das mal so sagen darf.
                  Zuletzt geändert von axo; 31.01.2006, 00:12.

                  Kommentar


                  • #10
                    Moin,

                    Ersätze Methoden durch Variablen.
                    War schon später am Abend.

                    Ich werds eben umeditieren.

                    Gruß Thomas

                    €:
                    Ich lese grade den Block dazu. Es ist richtig was da steht in dem Zusammenhang. Das Fahrrad sollte niemals die Hupen Methode der Auto Klasse aufrufen.
                    Zuletzt geändert von Alrik; 31.01.2006, 08:02.

                    Kommentar


                    • #11
                      Original geschrieben von Alrik
                      Ersätze Methoden durch Variablen.
                      das ist ebenfalls nicht ganz richtig. hier hast du einige sachen nur halb gelesen, scheint es. membervariablen eines objektes sollen und dürfen durchaus von anderen objekten ausgelesen werden, sonst macht OOP (als eine methode der programmierung, um daten und dazugehörige methoden zusammenzuführen) nicht wirklich sinn. wann, wie und wo ein objekt seine variablen vor änderungen schützt, versteckt oder was auch immer, muss der autor einer klasse natürlich selbst bestimmen.

                      Ich lese grade den Block dazu. Es ist richtig was da steht in dem Zusammenhang. Das Fahrrad sollte niemals die Hupen Methode der Auto Klasse aufrufen.
                      das ist aber nicht ein problem der programmierung mit OOP an sich, sondern ein logik-problem, das domänenwissen voraussetzt. das darfst du nicht einfach so als 'grundregel der OOP' darstellen.

                      wenn in der problemdomäne ein fahrrad logischerweise nicht die hupe eines autos betätigen kann, dann darf es die methode natürlich nicht aufrufen.

                      gibt es andererseits in der problemdomäne ein fahrrad, das autohupen betätigen kann, warum soll das per se verboten sein?

                      deine beiden 'regeln' - die von weiter oben mit dem nicht-aufrufen-dürfen von methoden, und die von vorhin mit dem nicht-aufrufen-dürfen von instanzvariablen würden, sofern sie jemand für voll nimmt, einerseits alle strukturmuster, andererseits alle verhaltensmuster ( link) mit einem wisch für ungültig und inadäquat erklären.

                      also: erkläre deine meinung oder zurück zum bücher-lesen.
                      Zuletzt geändert von axo; 31.01.2006, 11:20.

                      Kommentar


                      • #12
                        Membervariablen außerhalb eines Objektes aufzurufen, ist NICHT mehr OOP, weswegen sie grundsätzlich als private deklariert werden sollten.
                        Dafür muss das Objekt Methoden besitzen, welche die Membervariablen zurückgeben oder sie setzen können.

                        Man gibst dem Fahrrad gleich eine Methode zum Hupen (man würde eher eine abstrakte Klasse/interface definieren und Auto und Fahrrad davon erben lassen, wenn sie diese Methode teilen), als die Methode Hupen der Autoklasse in der Fahrradklasse ausführen.
                        Zuletzt geändert von Alrik; 31.01.2006, 12:11.

                        Kommentar


                        • #13
                          Wow !

                          Ich danke Euch. Es sind alles interessante Sachen was Ihr geschrieben habt.

                          Zu meinem Beispiel.

                          Ich habe auf der Datenbank Tabellen Autor, Buch und einiege mehr.
                          Autor und Buch sind mit eine Beziehungstabelle Buch_has_Autor verknüpft, da es eine m:n Beziehung ist. Ich meine ein Buch kann von mehreren Authoren geschrieben worden sein und ein Autor hat bestimmt eins oder mehr als eins Buch geschrieben.

                          Nun möchte ich verschiedene Listen (auch gefiltere) ausgeben. Dabei auch z.B. nur Autoren oder nur Bücher (na ja hier wahrscheinlich doch gleich mit dem Autor).

                          Ich habe mich also ein wenig an der Datenbankstruktur orientiert und dachte ohh ich brauche also eine Klasse Autor eine Klasse Buch und natürlich eine Connection Klasse zur Datenbank.
                          Ist diese Denkweise richtig, oder bin ich auf dem Holzweg.

                          Sorry, wenn ich so nerve, aber ich brauche irgendein "Klick" in meinem Kopf damit ich endlich die OOP-Paradigma richtig verstehe. Ich möchte ja nicht den Fehler machen und Klassen einfach anlegen aber im Grunde wie sequentiell programmieren.
                          Xdevel

                          Kommentar


                          • #14
                            Hallo,

                            Du hättest dann 3 Klassen, die genau das gleiche machen, nur anders verpackt.

                            Du brauchst nur eine Mysql Klasse, der du verschiedene Anfragen mitgeben kannst.

                            Anwendungsbeispiel:
                            PHP-Code:
                            $mysql = new mysql('host','user','password','database')
                            $mysql->query('select * from books');
                            $data_books $mysql->fetch_array();

                            // hier folgt eine Schleife zur Ausgabe der Bücherdaten

                            // jetzt möchtest du noch eine Liste der Autoren
                            $mysql->query('select * from authors'); // die Datenbankverbindung besteht noch immer
                            $data_authors $mysql->fetch_array();

                            // hier folgt eine Schleife zur Ausgabe der Autorendaten 
                            Gruß Thomas

                            Kommentar


                            • #15
                              Original geschrieben von Alrik
                              Hallo,

                              Du hättest dann 3 Klassen, die genau das gleiche machen, nur anders verpackt.

                              Du brauchst nur eine Mysql Klasse, der du verschiedene Anfragen mitgeben kannst.

                              Anwendungsbeispiel:
                              PHP-Code:
                              $mysql = new mysql('host','user','password','database')
                              $mysql->query('select * from books');
                              $data_books $mysql->fetch_array();

                              // hier folgt eine Schleife zur Ausgabe der Bücherdaten

                              // jetzt möchtest du noch eine Liste der Autoren
                              $mysql->query('select * from authors'); // die Datenbankverbindung besteht noch immer
                              $data_authors $mysql->fetch_array();

                              // hier folgt eine Schleife zur Ausgabe der Autorendaten 
                              Gruß Thomas

                              Aaaa
                              Das hört sich gut an und vor allem einfacher. Ich glaube ich habe so ein Beispiel sogar mal gesehen, ich dachte immer nur im "view" sollte man keine sql-Abfragen drin haben.

                              Bin von java server pages ein wenig gepregt, hatte früher bei einem Projekt gearbeitet und als client-Entwickler hatte ich nur Methoden von den core-Programmierern bekommen. Ich dachte, dass muss man bei php auch so machen. Halt alles gekappselt in Klassen.

                              Ich glaube manchmal ich mache mir das alles viel zu komplieziert als es ist.

                              Ich versuche dann so mein Projekt zu lösen.

                              Vielen Dank noch mal für eure Hilfe.
                              Xdevel

                              Kommentar

                              Lädt...
                              X