Lutz Fechner: Allgemein: Objekte und Klassen

Hallo,

ich habe PHP und andere Programmiersprachen alle selbst zu Hause "Stück
für Stück" und ohne System gelernt. Allerdings haben Objekte und Klassen nie Einzug in meine Programme gehalten.

Mir fehlt einfach das Grundverständnis, wofür es sinnvoll ist, Objekte und Klassen zu benutzen. Da objektorientiertes Programmieren ja keine unnötiger Zusatz ist, sondern doch ehr Grundlegend, würde ich das ganze dann doch gerne mal lernen.

Mein Stand: Ich weiß ungefähr soviel (oder ich glaube zu wissen, vielleicht ist es auch falsch...;]):

Eine Klasse legt fest, wie sog. Objekte aussehen, die mit ihrer Hilfe "erschaffen" werden können. Objekte beinhalten Variablen und Funktionen, die für das Objekt selbst von Bedeutung sind.

Soweit, so gut (oder auch schlecht). Wenn ich Google oder hier im Forumsarchiv schau, finde ich immer nur spezielle Fragen zu Problemen mit Klassen und Objekten, in der PHP-Dokumentation steht auch nichts GRUNDLEGENDES zu diesem Thema; es ist natürlich nur erklärt, wie das ganze in PHP zu bewerkstelligen ist, setzt aber schon Wissen über Objekte vorraus, welches ich wie gesagt nicht habe.

Was ich also suche ist ein GRUNDLEGENDES Tutorial zum Thema objektorientiertes Programmieren, natürlich sehr gerne mit Bezug auf PHP, damit ich nicht wieder mein altes Delphi-Wissen oder gar das magere C++ Know-How auspacken muss. Anwendungsbeispiele wären auch nicht schlecht, also wann es sinnvoll ist, Objekte zu benutzen usw.
Ich hoffe, ihr wisst, was ich meine ;)

Vielen Dank im Vorraus!
Lutz Fechner

  1. Hallo Lutz,

    vielleicht nützt dir ja folgendes "Kurztutorial" für den Anfang:

    Es hilft beim Erlernen der Grundzüge objektorientierten Lernens, wenn man sich ein konkretes Objekt vorstellt. Ich habe schon Anleitungen für objektorientierte Autos, Einkaufswagen, Hunde und was weiß ich nicht alles gelesen. Ich habe vor ca. 6 Monaten mal eine Anleitung mit einer OO-Katze geschrieben. Sie stellt die ersten Schritte für PHP4 dar. Eigentlich ist es auch keine richtige Anleitung, sondern eine Sammlung meiner Antworten in einem Web-Board.

    ========

    Zuerst erstellst du eine Klasse mit einigen Grundeigenschaften:

      
    class KATZE {  
      var $name;  
      var $fell;  
      var $laune;  
      var $traegheit;  
      
    function KATZE() {  
      $this->name = 'Garfield';  
      $this->fell = 'orange';  
      $this->laune = 0;  
      $this->traegheit = 'maximal';  
    }  
      
    // hier weitere Methoden hinzufügbar  
      
    } //end_of_class KATZE  
    
    

    Funktionen innerhalb der Klassendefinition heißen Methoden.
    Die Methode mit dem gleichen Namen wie die Klasse heißt Konstruktor. Sie wird automatisch aufgerufen, wenn eine neue Instanz der Klasse erstellt wird. Und das geht so (im Hauptprogramm):

      
    $meine_katze = new KATZE;  
    
    

    Ermordet wird die KATZE brutal und einfach per unset($meine_katze), aber das lassen wir jetzt einfach mal weg.

    Um den Zustand der Katze abzufragen, muss man Methoden definieren (in der Klassendefinition, nicht im Hauptprogramm), die dies tun:

      
    function schnurrt() {  
      if( $this->laune > 0) return(TRUE);  
      return(FALSE);  
    }  
    
    

    So fragt man die Laune der Miez im Hauptprogramm ab:

      
    if( $meine_katze->schnurrt() ) {  
      print('Die Miez schnurrt.');  
    }  
    else {  
      print('Die Miez gibt momentan keine Geräusche von sich.');  
    }  
    
    

    Man kann natürlich auch Einfluss auf das Objekt nehmen
    (wieder in der Klassendefinition):

      
    function amSchwanzZiehen() {  
      $this->laune = -1;  
    }  
    
    

    Jetzt rufst du im Hauptprogramm auf:

      
    $meine_katze->amSchwanzZiehen();  
    
    

    Wenn du jetzt die Laune abfragst, hat sich diese geändert.
    Natürlich kann man auch Parameter übergeben (Klassendefinition):

      
    function umtaufen($neuer_name) {  
      $this->name = $neuer_name;  
    }  
    
    

    Katze (im Hauptprogramm) umtaufen:

      
    $meine_katze->umtaufen('Spot');  
    
    

    Jetzt hört Garfield nicht mehr auf den Namen Garfield. Aber das tun Katzen ja sowieso eher selten ...

    ========

    So erklärt sich die Sache am einfachsten: OOP am (lebenden) Objekt. Da fällt mir noch eine schöne Methode ein. Sie ist zwar aus einem Perl-Buch und für ein Auto-Objekt, aber unsere Miez hat ja auch eine Farbe (wie Autos):

      
    function umlackieren($neue_farbe) {  
      $this->farbe = $neue_farbe;  
      $this->laune = -100;  
    }  
    
    

    ========

    Hier fragte dann jemand nach den speziellen OO-Eigenschaften von PHP, wie Vererbung, Kapselung usw.

    ========

    Ich würde mal sagen "schwache Kapselung" ist für PHP4 sehr euphemistisch ausgedrückt: Da wird überhaupt nichts gekapselt: Man kann auf objekt-interne Variablen zugreifen, alle Methoden vom Hauptprogramm aus aufrufen usw. Das oo-typische "Black-Box-Prinzip" ist also überhaupt nicht gegeben. Wenn man sich aber an die Regeln hält, und z.B. so tut, als ob man nicht auf die objekt-internen Variablen zugreifen kann, stellt das weniger ein Problem dar. Um gut nutzbaren Code zu erzeugen, sollte man sowieso darauf verzichten, Variablen nach außen hin sichtbar (PUBLIC) zu machen. Eigenschaften eines Objekts sollten immer durch Methoden abgefragt werden. Also, um bei meinem Beispiel zu bleiben (wieder im Hauptprogramm) nicht schreiben:

      
    $welche_farbe_hat_die_miez = $meine_katze->fell;  
    
    

    sondern:

      
    $welche_farbe_hat_die_miez = $meine_katze->fellfarbe();  
    
    

    In der Klassendefinition:

      
    function fellfarbe() {  
      return($this->fell);  
    }  
    
    

    Ändert man nämlich die Eigenschafts-Definition der Klasse, könnte die Variable $this->fell verschwinden und durch bessere Definitionen ersetzt werden:

      
    var $fellfarbe; // z.B. grau, orange, schwarz  
    var $fellart; // z.B. einfarbig, gestreift, gepunktet  
    
    

    Alle Methoden und Codebestandteile des Hauptprogramms, die bisher die Variable $this->fell direkt abfragten, müssten jetzt geändert werden. Bei der "Methoden-Methode" dagegen, muss nur die eine Methode abgeändert werden:

      
    function fellfarbe() {  
      return($this->fell);  
    }  
    
    

    Der Rest bleibt wie gehabt. Das ermöglicht zum Beispiel auch abwärtskompatibles Programmieren.

    Für Methoden gibt es eine Möglichkeit, private Methoden auch in PHP zu erzeugen, d.h. den Aufruf nur innerhalb von anderen Methoden des gleichen Objektes zu ermöglichen. Dies bleibt aber nur ein Würgaround für Notfälle.

    ========

    Zu den weiteren OO-Themen, wie Vererbung und Co, dürfen sich jetzt die Fachleute äußern. ;-)

    Vielleicht hilft ja auch die Online-Dokumentation von PHP(4):
    http://de.php.net/manual/de/language.oop.php

    --
    Und da wundern wir uns, dass die Mehrheit deutscher Abiturienten Heraklit für einen Dämmstoff hält.
    (Frank Lüdecke)