PHP und OOP

http://www.devmag.net/webprog/php_oop_1.htm

download phpoop.zip (34,9 KB) Stand vom: 24.03.2002
 

Inhalt

 

[ top ]

Theorie der OOP

Streng gesehen ist PHP keine Programmiersprache die als Objektorientierte Programmiersprache bezeichnet werden kann, dennoch hat PHP einige Möglichkeiten, mit welchen man annähernd Objektorientiert Programmieren kann. Im ersten Teil soll aber zunächst geklärt werden, was überhaupt Objektorientierte Programmierung ist.

 

Bei der objektorientierten Programmierung, taucht der Begriff eines Objektes immerzu auf. Doch was ist ein Objekt überhaupt? Im Alltag wird die Bezeichnung eines Objektes oft verwendet, doch welche Eigenschaften hat ein solches Objekt.
Eine Maus ist zum Beispiel ein Objekt. Sie hat aber so viele Eigenschaften, und Fähigkeiten, das man diese nicht mehr erfassen kann. Die Handlung der Maus sind nicht vorhersagbar, oder fest bestimmt.

Ein programmiertechnisches Objekt ist in dieser Hinsicht einfacher zu Handhaben. Diesen Objekten kann man ein festes Verhalten "einprogrammieren". Diese Strukturen und Funktionen lassen sich dann auf jedes andere Objekt anwenden, welches nach diesem Bauplan gebaut wurde.

Die Vielfalt dieser Programmiertechnik ist oft nicht leicht zu erkennen.
Schreibt man gewöhnliche Skripte oder Programme, dann werden die Daten in Variablen gespeichert, und diese dann z.B. über Kontrollstrukturen verarbeitet, und neue Werte hinzugefügt, oder verändert.
Bei der Objektorientierten Programmierung gibt es solche Techniken nicht. Hier wird ein Objekt nicht als Speicherplatz, wie eine Variable, gesehen, sondern ist ein komplexes Konstrukt, das eigenständig ist und welchem man beliebige Eigenschaften geben kann.

Objekte sind nur Ergebnisse aus einer Klasse. Eine Klasse ist wie ein festes Rezept, nach dem diese Objekte gebildet werden.
Hier ist auch schon einer der wichtigsten Aspekte der Objektorientierten Programmierung anzusiedeln. Diese Objekte sind eigenständige Körper, ein Objekt muss nicht dem anderen gleichen.
Ein Beispiel ist das Objekt eines neuen Benutzers, in einer Community. Der Besucher gibt seine Daten ein, Vorname, Nachname, Adresse,...
Nach diesem wird ein neues Objekt geformt, ein einmaliges Objekt, nämlich das Objekt eben dieses Benutzers.
Nach dem Ablauf des Programms verlieren sich diese Objekte, wie Variablen. Sie werden nicht gespeichert. Hierzu müssen Datenbanken eingesetzt werden, in welchen die Daten gespeichert werden. Aus diesen Daten kann dann, z.B. bei einem Login das Objekt des Benutzers wieder gebildet werden.

Eine Klasse ist wie gesagt ein fest, doch auch das ist in der Hinsicht nicht richtig. Von dieser Klasse kann man weitere Klassen ableiten.
Ein einfaches Beispiel ist z.B. eine Klasse welche einen Baum als Objekt erzeugt. Das ganze hört sich ein wenig...an, man kann es aber so sehen.
Jetzt will man eine Klasse programmieren, die einen Apfelbaum als Objekt erstellt. Warum sollte man dann nicht die erste Klasse weiterverwenden, sodass man nur noch einige Funktionen für die Erstellung eines Apfels an diesem Baum programmieren muss.
Diese Möglichkeit nennt man in der Sprache der Objekte, "Vererbung". Die Daten einer Klasse werden an die einer anderen vererbt.
Die Stärke der Programmierung auf diese weiße zeigt sich schnell. Objektorientierte Programme sind möglichst einfach aufgebaut, sodass man von jeder Klasse die Möglichkeit hat, eine weitere abzuleiten.

In diesem ersten Teil sind die wichtigsten Begriffe in bezug auf OOP definiert werden. Im nächsten Teil geht es an die Praxis mit PHP.
 

 

[ top ]

 

Klassen und Objekte mit PHP

Das Grundverständnis, und die Besonderheiten sind im ersten Teil klar geworden. Im zweiten Teil wollen wir uns der Praxis widmen, und die ersten eigenen Klassen schreiben.

 

Nachdem die Objektorientierte Programmierung in seinen Grundsätzen erklärt ist, können wir uns den ersten Klassen und Programmen widmen, die diese Grundsätze ein wenig verwirklichen.

Eine Klasse wird in PHP mit dem Wort class eingeleitet, danach folgt der Name der Klasse.

Ein Beispiel:

<?php
class hallo

{ // Klasse beginnt

var $name;

function say_hello()
{
echo "Hallo $this->name";
}

} // Klasse endet


$say = new hallo;

$say->name = "Thiemo";
$say->say_hello();

?>

Das Ergebnis dieses Beispiels ist die Ausgabe "Hallo Thiemo".

OK sagen Sie, das hätte ich auch mit einem viel einfacheren Skript machen können?
Das ist klar, es ist nur ein Beispiel, für die Arbeit einer Klasse.
Klassen bestehen aus vielen Methoden, Methoden sind wie im "normalen" PHP, Funktionen.
Ein Objekt einer Klasse kann viele Eigenschaften haben, wie die Augenfarbe eines Menschen, eine Eigenschaft von diesem ist. Das Beispiel hat die Eigenschaft $name, welche in einer gewöhnlichen Variablen gespeichert wird.
Hierbei ist zu beachten, das diese Eigenschaften oder Variablen mit einem "var" definiert werden müssen. Bei der normalen PHP-Programmierung ist fest definiert, welchen Wert eine Variable hat. Hier ist aber leicht zu erkennen, das die Eigenschaft jeden Wert annehmen kann, der ihr als Eigenschaft eines Objektes zugewiesen wird.

Die gesamte Klasse besteht aus einer Methode, "say_hello()".
Die Methode "say_hello()" hat die Aufgabe, den Wert der Eigenschaft $name wieder auszugeben. Das geschieht über den echo-Befehl. Da PHP nicht "weiß", welchen Wert die Eigenschaft hat (sie ist innerhalb der Klasse nicht definiert), muss darauf hingewiesen werden, das geschieht mit dem $this-> vor dem Namen der Eigenschaft.
Dieses $this-> spricht den Wert der Eigenschaft an, welcher ihr nach dem Ableiten des Objektes zugewiesen wurde.

Eine neues Objekt, mit dem Bauplan dieser Klasse wird über $say= new hallo; abgeleitet. Dies geschieht mit dem Befehl
$objekt = new klasse;
Das new steht für neu, und klasse eben für den Namen der Klasse.

Zurück zu unserem Beispiel. Das Objekt wird jetzt mit $objekt bzw. $say angesprochen. Es kann über diesen Namen mit der Klasse "kommunizieren" und dadurch sich selbst neue Eigenschaften zuweisen.
Eben dieses zuweisen einer neuen Eigenschaft geschieht in der nächsten Zeile.

$say->name = "Thiemo";

Es wird die Eigenschaft "name" des Objektes $say angesprochen. Dieser Eigenschaft wird hier der Wert "Thiemo" zugewiesen. Das Objekt hat jetzt eine definierte Eigenschaft "name", welche durch die Funktion "say_hello()" ausgegeben wird.
Diese Funktion muss man aber wiederum direkt über das Objekt $say aufrufen, und ihr sozusagen "erlauben" die Methoden auszuführen.

Im dritten Teil wird ein komplexeres Beispiel, nämlich eine Datenbankklasse programmiert.
 

 

[ top ]

Eine MySQL Klasse

Der dritte Teil des Kurses stellt eine komplexe Datenbankklasse vor, mit der die Verbindung zu MySQL Datenbanken gesteuert werden kann.

 

Das Beispiel aus Teil 2 lässt wohl kaum irgendeine Stärke der OOP aufblitzen. Eine richtige nützliche Klasse ist eine, die mit einer MYSQL-Datenbank kommuniziert. Methoden einer solchen Klasse wären, Verbindung aufbauen, Datenbank auswählen, Abfragen senden...
Auch anhand dieses Beispiel lernen Sie eine weitere Möglichkeit der Arbeit mir Objektorientiertem PHP kennen.

<?php

class db
{
var $connid;
var $erg;

function db($host,$user,$passwort)
{
if(!$this->connid = mysql_connect($host, $user, $passwort))
{
echo "Fehler beim Verbinden...";
}
return $this->connid;
}

function select_db($db)
{
if (!mysql_select_db($db, $this->connid))
{
echo "Fehler beim Auswählen der DB...";
}
}

function sql($sql)
{
if (!$this->erg = mysql_query($sql, $this->connid))
{
echo "Fehler beim Senden der Abfrage...";
}
return $this->erg;
}

}

$db = new db("localhost","","");
$db->select_db("zeitschriften");
$erg=$db->sql("SELECT * FROM zeitschrift_cat");


?>

Dieses Beispiel ist wie sie sehen um einiges Komplexer. Es besteht aus drei Methoden, die erste Methode ist bereits eine der wichtigsten. Sie öffnet eine neue Verbindung mit der Datenbank.
Diese Methode wird auch als Konstruktor bezeichnet. Sie hat den selben Namen wie die Klasse an sich, und wird deshalb direkt mit dem Ableiten eines neuen Objektes ausgeführt.
Ein Konstruktor ist sehr hilfreich, mit ihm kann man z.B. nicht vorhandene Anfangsbedingungen schaffen. Da diese Methode einige Parameter benötigt, müssen diese direkt bei dem Ableiten des Objektes übermittelt werden.
Es werden dem Objekt zwei Eigenschaften gegeben, die $connid, in welcher der Verbindungshandler gespeichert ist, und die Eigenschaft $erg. In ihr werden Daten aus einer Datenbankabfrage gespeichert, auf welche man dann über das Objekt zugreifen kann.

In der ersten Methode wird der Eigenschaft connid ein Wert zugewiesen, dieser resultiert aus der entstandenen Verbindung.
Dieser Wert wird dann zurückgegeben, sodass man über das Objekt auf diesen zugreifen kann.
Über die zweite Methode wird die Datenbank ausgewählt. Der Aufruf der Methode erfolgt mit der Übermittlung der Datenbank, die ausgewählt werden soll:

$db->select_db("zeitschriften");

Die Methode "sql($sql)" übermittelt Datenbankabfragen. Ist die Datenbankabfrage erfolgreich, wird das Ergebnis der Eigenschaft "erg" übermittelt. Auf diese Daten kann man dann extern, also über das abgeleitete Objekt wieder zugegriffen werden.

Diese Klasse ist noch erweiterbar. Man kann eine Methode programmieren, welche die Daten ausgibt, oder verändert, und erneut in der Datenbank speichert.
Man kann die einzelnen Methoden auch untereinander Verknüpfen, sodass eine feste Handlungskette entsteht, und man nur noch das Ergebnis hat.

Im letzten Teil des OOP Kurses lernen Sie die Vererbung mit PHP kennen.

 

[ top ]

Vererbung von Klassen

PHP und Objektorientierte Programmierung noch etwas komplexer - Vererbung von Klassen

 

Der letzte Teil beschäftigt sich mit der Vererbung von Klassen, und die daraus resultierenden Ergebnisse, und was das für die erstellten Objekte bedeutet.

Eine Vererbung von einer Klasse bedeutet immer gleich auch die Vererbung aller Methoden dieser Klasse. Die andere Klasse, die auf die erste gestützt ist, kann folglich auf alle Methoden der anderen Klasse zurückgreifen, und diese Ergebnisse abfangen, und weiterverarbeiten.

Ein Beispiel - Klasse 1:

class benutzer

{

var $beschreibung;

function beschreibung($vorname, $name)
{
$this->beschreibung="Ich heiße $vorname, $name";

return $this->beschreibung;
}
}

Diese Klasse erzeugt einen neuen Benutzer mit einer Beschreibung. Diese Beschreibung lautet dann, je nach Name:
"Ich heiße Name, Vorname".
Diese Beschreibung wird dann an die Eigenschaft "beschreibung" zurückgegeben.

Eine zweite Klasse, die sich auf diese Klasse stützt, also aus einer Vererbung entstanden ist, soll zu dieser Beschreibung noch die jeweilige Augenfarbe hinzufügen.
Das Ergebnis soll so aussehen:
"Ich heiße Name, Vorname, und habe Farbe Augen."

Die abgeleitete Klasse sieht wie folgt aus:

class augenfarbe extends benutzer
{
var $augenfarbe;

function farbe($farbe)
{
$this->augenfarbe="und habe $farbe Augen";
return $this->augenfarbe;
}

function beschreibung_neu()
{
$this->beschreibung=$this->beschreibung.",".$this->augenfarbe;

return $this->beschreibung;
}

}

Die Vererbung wird durch extends benutzer eingeleitet. Es wird angegeben, das diese Klasse von der Klasse benutzer abhängt.
Diese Klasse ist schon ein wenig unübersichtlicher.
Eine neue Methode ist dazugekommen, die Methode "farbe($farbe)". Mit ihr wird der Textteil erstellt, der zu der Beschreibung hinzugefügt werden soll.
Das wäre also:
"und habe Farbe Augen.".
Die Daten für die Farbe werden beim Aufruf der Methode über das Objekt übermittelt.
Die zweite Methode erstellt die neue Beschreibung, indem Sie mit dem Stringoperator "." Die beiden Teile der Beschreibung zusammenführen.

Die erste Beschreibung muss aber nicht mehr über die Klasse benutzer definiert werden, sondern Sie wird direkt aus der Ableitung der Klasse und somit auch aus der Funktion, erstellt.

Ein Objekt, was über diese Klasse erstellt wird, hat also neben den zusätzlichen Eigenschaften auch die Eigenschaften der Klasse benutzer.
Ein Objekt wird wie folgt abgeleitet:

$nutzer = new augenfarbe;

$beschreibung= $nutzer->beschreibung("Thiemo", "Fetzer");
//erste Beschreibung, nicht mehr von der ersten Klasse abhängig

$augenfarbe= $nutzer->farbe("grün-braun");
//zweiter Teil der Beschreibung wird definiert

$beschreibung_neu = $nutzer->beschreibung_neu();
//das Ergebnis der Zusammenführung

echo "$beschreibung_neu";

Alle Eigenschaften und Abfragen richten sich an das Objekt der Klasse augenfarbe. Diese Klasse besteht ebenfalls aus den Methoden der Klasse benutzer, welche dann über das Objekt aufgerufen werden können.

Das Beispiel ist schwer zu durchleuchten, da die Verwendung einer zweiten Klasse anscheinend keinen Sinn macht. Die Verwendung von Vererbung zwischen Klassen macht erst bei größeren Programmkomplexen sinn. Diese Programmkomplexe sind dann auf einer Basisklasse aufgebaut, die die grundlegenden Methoden enthält. Von dieser Basisklasse werden alle anderen Klassen abgeleitet.

 

©Copyright 2001-2002 devmag.net
Nachdruck und Weiterverbreitung, auch Auszugsweise, nur mit Genehmigung.
 

[ top ]


PHP: OOP Template System

http://www.it-academy.cc/content/article_browse.php?ID=1357

Template Systeme werden benutzt, um Design von Code zu trennen. Dadurch wird ein großes Projekt übersichtlicher und leichter zu bearbeiten. In diesem Artikel wird ein einfaches Template System aufgebaut, dass Platzhalter in einem HTML Dokument durch die in der *.php Datei erzeugten Werte ersetzt.

Autor: Dominik Wolter (Scorpion)
Datum: 25-10-2004, 17:00:40
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 903x
Rating: 7.33 (3x bewertet)

Hinweis:

Für den hier dargestellten Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.


Einleitung

Die komplette Template Klasse soll wieder in einer Datei enthalten sein. Unsere Ausgangssituation besteht also aus drei Dateien. Zum Einen die Klasse selbst (template.class.php), dann der PHP Teil der Website (news.php) und das Layout (layout.html). Die Klasse sollte folgende Features besitzen:

    Definierte Datei (layout.html) einlesen

  1. Platzhalter in der Datei durch PHP generierte Werte ersetzen
  2. Layout Datei mit PHP Werten ausgeben<&li>

Template Klasse

Wer noch nichts von OOP in PHP gehört haben sollte, empfele ich den Artikel OOP in PHP zu lesen, um Verständnisproblemen vorzubeugen.

Das Gute an Templates ist, dass es nur eine Ausgabe (echo) am Ende der PHP Datei gibt. Somit kann man im kompletten oberen Teil noch Befehle wie "header", die vor jeder Ausgabe verwendet werden müssen benutzen.
Es folgt die reichlich kommentierte Template Klasse.

Datei template.class.php:

<?php
// Klasse initialisieren
class template {

var
$tmp_file; // Pfad zur Template Datei
var $error; // Fehlermeldung
var $content; // Inhalt des Templates

// Konstruct
function template($file, $error = "Template Datei nicht gefunden!") {

// Variabeln auf Standardwerte setzen
$this->tmp_file = $file;
$this->error = $error;
$this->content = "";

}

// Template Datei öffnen
function readtemplate() {

$file = @fopen($this->tmp_file, "r");

if(!
$file) {

echo
$this->error;

}
else {

// Datei einlesen
while(!feof($file)) {

$temp = fgets($file, 4096);
$this->content .= $temp;

}

}

}

// Platzhalter ersetzen
function replace($title, $value) {

// Alle {TITLE} durch VALUE ersetzen
$this->content = str_replace("{" . $title . "}", $value, $this->content);

}

// Fertige Datei ausgeben
function parse() {

echo
$this->content;

}

}
?>


Datei news.php:

<?php
// Dynamische Variabeln
$autor = "Scorpion";
$date = "24. Oktober 2004";
$headline = "Template Klasse";

// Klasse hinzuladen
include("template.class.php");

// Objekt erzeugen ($error wird bereits im Konstrukt definiert und ist hier nur optional)
$template = new template("layout.html");
// Datei einlesen
$template->readtemplate();
// Platzhalter ersetzen
$template->replace("AUTOR", $autor);
$template->replace("DATE", $date);
$template->replace("HEADLINE", $headline);
// Seite ausgeben
$template->parse();
?>


Datei layout.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>{HEADLINE}</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<h2>{HEADLINE}</h2>vom {DATE}<br>
<br>
<br>
<em>by {AUTOR}</em>
</body>
</html>


Mit dem Aufruf der Datei news.php wird zuerst die Klasse hinzugeladen und danach das neu generierte Layout ausgegeben.

Vorteile von Templates:

 

[ top ]