Anzeige
Tutorialbeschreibung

PHP - Teil 30 - Ein kurzer Blick auf die objektorientierte Programmierung

PHP - Teil 30 - Ein kurzer Blick auf die objektorientierte Programmierung

Ein Thema, das auf den ersten Blick etwas sperrig wirken mag, ist die objektorientierte Programmierung in PHP. Dennoch ist diese Programmiervariante ein wichtiges Kernkonzept, wenn man sich weitergehend mit PHP befassen will/muss. In diesem Video-Training wird gezeigt, was es mit diesem Programmierkonzept eigentlich auf sich hat und wie es sich praktisch einsetzen lässt. Dabei soll dieses Video-Training keine detaillierte Einführung in das Thema Objektorientierung geben. Dafür ist die Thematik schlichtweg zu komplex. Ihr könnt euch anhand dieses Video-Trainings aber einen ersten Eindruck vom Prinzip der Objektorientierung in PHP verschaffen.

Icon-Ersteller: ArtDesigner.lv

... übrigens findest du die komplette Serie hier: PHP-Workshop-DVD - Basics & Tricks - Schnapp sie dir in unserem Shop oder in der Kreativ-Flatrate!


In der objektorientierten Programmierung findet die Strukturierung eines Programms durch eine Datenabstraktion statt. Die Daten und die Datenstrukturen, und nicht der Algorithmus, stehen hier im Mittelpunkt. Funktionen und Algorithmen werden den Daten logisch zugeordnet. Die Daten benötigen die Funktionen zur Änderung ihres Zustands.

Ein Programm kann aus mehreren Objekten bestehen. Jedes dieser Objekte ist für einen Teil der Daten verantwortlich. Zur Lösung der Aufgabe des Programms kommunizieren die Objekte untereinander.


Klassen definieren

Wenn die Sprache auf die Objektorientierung kommt, führt anfangs eigentlich kein Weg an der Definition von Klassen vorbei. Deklariert werden solche Klassen in PHP über das Schlüsselwort class. (Das ist so übrigens auch in vielen anderen Sprachen üblich).

Das folgende Beispiel zeigt, wie sich eine einfache Klasse in PHP definieren lässt.

<?php
// Klassendefinition
class Auto{
   // Klasseneigenschaften
    public $name  = "318d";
    public $hersteller  = "BMW";
    public $preis = 37.978;
   // Klassenmethode
    public function Kaufen($kaeufer){
   echo "Käufer: $kaeufer\n";
    echo "Verkauf eines ";
    echo $this->name . " von ";
    echo $this->hersteller . "\n";
    echo "Der Kaufpreis beträgt: " . $this->preis;
    }
}
?>


 
Definiert wurde hier die Klasse Auto. Dieser Klasse wurden drei Eigenschaften zugewiesen:

$name
$hersteller
$preis

Diesen drei Eigenschaften wurden Standardwerte zugeordnet. Außerdem kommt im gezeigten Beispiel das Schlüsselwort public zum Einsatz, wodurch die damit gekennzeichneten Variablen als öffentliche Mitglieder markiert werden. Neben den drei Eigenschaften besitzt die Klasse Auto mit Kaufen auch gleich noch eine Methode. Diese Methode wurde ebenfalls über das Schlüsselwort public als öffentlich gekennzeichnet.

Jede Klasse wird über das Schlüsselwort class deklariert. Um Klassenattribute zu definieren, wird innerhalb der Klasse das Schlüsselwort var, gefolgt von einer Variablen, festgelegt. In einer Klasse können beliebig viele Klassenattribute angelegt werden. Jede Klasse wird durch geschweifte Klammern gekennzeichnet. Beachtet, dass zum Beenden der Klasse kein Semikolon verwendet wird.

class Ausgabe{
  var $Wert
  // Funktionsdefinition
  {
  //Funktionsdefinition
  }
  }


Bezüglich der Vergabe von Klassennamen habt ihr weitestgehend freie Hand. Dennoch sollten sowohl Sonder- und Leerzeichen als auch Umlaute nicht verwendet werden. Der Name stdClass ist reserviert, da dieser intern von ZEND benutzt wird, und darf als Klassenname ebenfalls nicht eingesetzt werden. Ferner wird empfohlen, Klassennamen nicht mit einem Unterstrich zu beginnen.


 

Objekte löschen

Objekte belegen Speicherplatz. So einfach diese Aussage ist, so deutlich macht sie, dass es sinnvoll sein kann, nicht mehr benötigte Objekte zu löschen und somit den von diesen besetzen Speicherplatz wieder freizugeben. Was bei anderen Programmiersprachen eine Selbstverständlichkeit ist, konnte in der Zend Engine 1 lediglich unelegant über die Funktion unset() oder die Zuweisung des Wertes NULL zur Objektvariablen realisiert werden. In der Zend Engine 2 ist es nun endlich möglich, Objekte tatsächlich zu löschen. Hierfür wurde der delete-Operator in die Sprachsyntax integriert, der sich folgendermaßen anwenden lässt.

<?php
  delete $Objekt;
?>


Hierdurch wird nicht nur der von $Objekt belegte Speicherplatz wieder freigegeben, auch werden alle Referenzen auf das Objekt aufgehoben.


Konstruktoren und Destruktoren

An zwei Begriffen führt – wenn man sich mit der objektorientierten Programmierung befasst – kein Weg vorbei: Konstruktoren und Destruktoren. Beide Begriffe mögen etwas merkwürdig klingen, sind aber unverzichtbare Bestandteile des Konzepts der objektorientierten Programmierung.

Um Objekte mit einem exakt definierten Anfangszustand zu erhalten, werden in OO-Programmiersprachen Konstruktoren eingesetzt. Wird ein hierdurch initialisiertes Objekt nicht mehr benötigt, dann wird dieses durch einen Destruktor wieder zerstört. Es stellt sich nun natürlich fast zwangsläufig die Frage, warum denn ein initialisiertes Objekt explizit zerstört werden soll? Denn Objekte existieren üblicherweise nur bis zum Ende der jeweiligen Skripte. (Sie verhalten sich also exakt so wie normale Variablen). Alternativ dazu können Objekte auch über unset() oder durch Setzen auf NULL vernichtet werden.

Das funktioniert normalerweise recht gut und PHP gibt den von einem Objekt belegten Speicherplatz wieder frei. Es gibt aber Situationen, in denen das nicht ohne Weiteres möglich ist. Ein typisches Beispiel dafür ist die Verbindungsaufnahme eines Skripts mit einer Datenbank. Stellt euch vor, ein Objekt stellt eine Verbindung zur Datenbank her und wird zerstört, während die Datenbankverbindung aufrechterhalten bleibt. Dadurch würde eine sogenannte verwaiste Verbindung bestehen bleiben.

Das kann früher oder später zu Problemen führen. (Letztendlich hängt das natürlich auch davon ab, welche Schutzmechanismen die jeweiligen Datenbanken aufweisen). Genau an diesem Punkt kommen die Destruktoren ins Spiel. Diese werden vor der endgültigen Zerstörung des Objekts aufgerufen.

Bei einem Konstruktor handelt es sich um nichts anderes als um eine Funktion, die immer dann aufgerufen wird, wenn das Objekt der Klasse instanziiert wird.

Bevor noch einige allgemeine Hinweise folgen, zunächst ein typisches Beispiel für den Einsatz von Konstruktoren und Destruktoren.

<?php
  class klassenDefinition {
     public function __construct() {
         echo "Wir sind im Konstruktor";
         $this->name = "klassenDefinition";
     }
     public function __destruct() {
         echo "Zerstöre folgende Klasse: " . $this->name . ".<br />";
     }
  }
  $objekt = new klassenDefinition();
  ?>


Die Ausgabe sähe in diesem Fall folgendermaßen aus:

Wir sind im Konstruktor.
Zerstöre folgende Klasse: klassenDefinition.


Um einen Konstruktor zu deklarieren, wird das Schlüsselwort _construct() verwendet. Allerdings wird der Konstruktor auch dann als Konstruktor erkannt, wenn er den Namen der Klasse besitzt. Anders als herkömmliche Funktionen besitzen Konstruktoren allerdings keinen Rückgabetyp. (Gleiches gilt übrigens auch für Destruktoren).

Um Objekte vollständig zu entfernen, wird der Destruktor verwendet. Gekennzeichnet ist dieser durch das Schlüsselwort _destruct().

 
Im vorherigen Beispiel wurde mit dem Schlüsselwort public gearbeitet. Die folgende Syntax verzichtet darauf.

<?php
  class meineKlassendefinition
  {  
    function __construct()
    {
      echo "Das ist der Konstruktor!";
    }
    function __destruct()
    {
      echo "Das ist der Destruktor!";
    }
  }
  $objekt = new meineKlassendefinition();
  print_r($objekt);
  ?>


Das Ergebnis sieht in diesem Fall folgendermaßen aus:

Das ist der Konstruktor! meineKlassendefinition Objekt
  (


  )
Das ist der Destruktor



Fazit

Das Konzept der objektorientierten Programmierung ist ein mächtiges Werkzeug, um Software effektiv zu entwickeln. Für kleine PHP-Skripte ist die Verwendung OOP hingegen häufig übertrieben. Was bleibt, ist wie immer der "goldene" Mittelweg, bei dem objektorientierte Programmierung nur dort eingesetzt wird, wo dies auch tatsächlich sinnvoll ist. Diesen Mittelweg zu finden, fällt aber häufig auch erfahrenen Entwicklern schwer. Für euch heißt das prinzipiell also nichts anderes, als dass ihr selbst entscheiden müsst, ob und wann der Einsatz OOP sinnvoll ist.


Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von franzg
  • 15.05.2017 - 00:52

Vielen Dank für die Informationen!

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 07.10.2016 - 12:58

Danke für das Tutorial.

Portrait von dmtw2107
  • 16.11.2013 - 09:49

verständlich und toll erklärt danke für das tutorial

Portrait von Basark
  • 03.10.2013 - 23:30

Alles noch sehr verwirrend. :(

Portrait von Noha1981
  • 11.06.2012 - 12:38

OOP in PHP - Ein spannendes Thema!
Wie zu Anfang selbst gesagt, ist das Thema der OOP selbst zu umfangreich, als das man es innerhalb eines Videos abarbeiten könnte. Jedoch muss ich mich leider den vorigen Kommentatoren anschließen.
Es wird ausschließlich ein wenig Code gezeigt, der immer wieder erläutert werden soll. Die Erläuterung basiert jedoch lediglich auf der Aussage: "So sieht das ganze aus".
OOP selbst basiert innerhalb des Videos auf einer Klasse und auf Konstruktoren und Destruktoren, deren Funktion aber auch nicht erläutert wird.
Weshalb werden Klassen benötigt, warum sollten Daten gekapselt werden (bei dir alle public!!!), warum ist es sinnvoll den gezeigten "Standard Konstruktor" zu überladen. Wie ist es innerhalb von PHP mit Vererbung und Polymorphie, als wichtige bestandteile der Modularisierung innerhalb der OOP.
Alles in Allem hat das Video eine gute Absicht, jedoch verfehlt es "meiner Meinung" nach das Konzept eines Lehrvideos, da lediglich nicht erläuterte Codeschnippsel gezeigt werden. Selbst für einen groben Syntaxüberblick fehlen leider die Erläuterungen!

Portrait von Gangsta33
  • 18.11.2011 - 06:59

Leider muss ich MIB101 recht geben. Ich habe auch wenigstens ein kurzes Beispiel mit Ausgaben und Funktionsweise erwartet. Wenigstens Variablen sollte man einmal übergeben und zurück bekommen. Es fehlt wie ich nun ein Objekt überhaupt erzeuge und damit Arbeite. Schade um die Punkte.

Portrait von psdandy
  • 12.11.2011 - 15:44

wurde mein Kommentar gelöscht?

Portrait von MIB101
  • 10.11.2011 - 23:23

Ich weiß ehrlich gesagt nicht, was ich von dem Video erwartet habe. Aber als OOP Neuling hat mir das jetzt nicht viel gebracht. Das war eine kurze Kurz-Einführung in OOP und "weggeschmissene" Punkte. Ich kann aber nichts zu den anderen Videos sagen, vielleicht war das hier ein ausreißer. Sorry.

Portrait von Taharkas
  • 05.11.2011 - 14:03

OOP generell ist schon ein sehr komplexes Thema. Logisch, dass dieses Tutorial nur einen minimalen Einblick schaffen kann. Das geht ja schon alleine bei der sinnvollen Verwendung/Erstellung von Klassen und Methoden los - wo es endet will ich gar nicht in den Raum stellen. Ich glaube, es wäre ein vielfaches an Tutorials notwendig um OOP auch nur einigermaßen vollständig darzustellen.
@rider03: Ein gutes Beispiel für die Verwendung von Klassen sind Datenbankschnittstellen (als Beispiel sei hier nur PDO genannt). Schau Dir mal eine strukturiert geschriebene Datenbankverbindung an und vergleiche sie z.B. mit PDO. Du wirst dort recht schnell die Unterschiede und vor allem die Vorteile der OOP sehen.

Portrait von rider03
  • 04.11.2011 - 11:13

Die OOP in php war immer eine Hürde, über die ich kaum hinweggekommen bin. Das Tutorial ist dabei schon eine Hilfe. Herzlichen Dank dafür!
Wünschen würde ich mir - zur Vertiefung - eine Gegenüberstellung: Ein kleines, funktionierendes Programm (das ein wenig über das "Hallo Welt" hinausgeht), einmal prozedural und einmal objektorientiert umgesetzt. Das wäre meiner Meinung nach die perfekte Fortsetzung, bzw. Ergänzung zu diesem sehr brauchbaren Tutorial.

lg Werner

x
×
×