IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - Objektorientiertes Programmieren in PHP



Objektorientiertes Programmieren in PHP

Objektorientiertes Programmieren (kurz OOP) macht viele Sachen einfacher bzw. übersichtlicher. Sprachen wie Java oder C++ bauen gar ganz auf diesem Prinzip auf. PHP untersützt OOP nur teilweise, aber die Grundzüge sind vorhanden. In diesem Artikel werden Sie zuerst lernen, wie man objektorientierte Programme aufbaut und zum Schluss werden Sie deren Vorteile anhand einer kompletten MySQL Klasse kennenlernen.


Autor: ()
Datum: 25-10-2004, 10:54:57
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 21754x
Rating: 8.5 (2x bewertet)

Hinweis:

Für den hier dargestellte 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.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einleitung

Ziel dieses Tutorials ist es, am Ende eine Datei zu haben, die eine MySQL Klasse enthält, mit der sich die Operationen "connect" und "close" durchführen lassen. Natürlich kann die Klasse danach beliebig erweitert werden. Die Datei wird einfach in ein bestehendes Projekt hinzugeladen (include) und stellt ein viel benutzerfreundlicheres Interface zwischen Programmierer und MySQL Datenbank dar.

Grundlagen der OOP

Ich habe aus persönlichen Erfahrungen feststellen können, dass zu viel praxisferne Theorie den Leser langweilt oder am weiterlesen hindert. Also beginnen wir mit einem Beispiel aus dem Alltag: Das Objekt (Klasse) Auto. Es besitzt verschiedene Eigenschaften (Variabeln). Außerdem kann man mit einem Auto z.B. bremsen oder beschleunigen (Methoden bzw. Funktionen). In PHP würde das ganze dann wie folgt aussehen.

Datei auto.class.php:

<?php
// Klasse (Objekt) initialisieren
class Auto {

// Variablen (Eigenschaften) initialisieren - evt. festlegen
var $farbe = "rot";
var
$momentane_geschwindigkeit;
var
$maximale_geschwindigkeit = 200;

// Funktion (Methode) zum Bremsen
function bremsen($staerke) {

return
$this->momentane_geschwindigkeit - $staerke;

}

// Funktion (Methode) zum Beschleunigen
function beschleunigen($staerke) {

$geschwindigkeit = $this->momentane_geschwindigkeit + $staerke;

if(
$geschwindigkeit > $this->maximale_geschwindigkeit) {

$geschwindigkeit = $this->maximale_geschwindigkeit;

}

return
$geschwindigkeit;

}

}
?>


Klassen beginnen in PHP immer mit "class" und dann dem Namen der Klasse. Der Inhalt der Klasse steht in geschweiften Klammern. Variablen der Klassen werden mit "var" initialisiert. Es gibt hier auch Variablen, die nicht unbedingt geändert werden müssen, wie z.B. die Farbe des Autos oder die maximale Geschwindigkeit. Die momentane Geschwindigkeit kann sich jedoch zu jedem Zeitpunkt ändern also wird ihr vorerst kein Wert zugeschrieben.

Funktionen werden mit "function" und dann dem Namen der Funktion eingeleitet. Auch hier wird der Inhalt der Funktionen in geschweifte Klammern gesetzt. Nach dem Namen der Funktion folgen in Klammern die Werte, die für die Verwendung der Funktion erforderlich sind. Sie müssen ja auch festlegen, wie stark Sie die Bremsen betätigen. Der Befehl "return" bestimmt den Rückgabewert der Funktion. In diesem Fall die Geschwindigkeit nach dem Bremsen. Variablen, die zuvor als "Klassenvariablen" initialisiert wurden, werden mit "$this->variabelname" aufgerufen. "$this" steht für die aktuelle Klasse - also "Auto".

Die zweite Funktion zum Beschleunigen ist im Prinzip das Gleiche, außer, dass zu beachten gilt, dass das Auto nicht über seine maximale Geschwindigkeit hinaus beschleunigen kann.

Verwendung von Objekten in PHP:

Um dies praktisch anzuwenden, muss man zuerst in PHP ein Objekt mit dem Inhalt der Klasse erstellen.
Objekte sind einfach nur spezielle Variabeln, also ist ihr Anlegen sehr simpel:

<?php
// Klasse hinzuladen
include("auto.class.php");

// Objekt erzeugen
$Objekt_Auto = new Auto;

// Zugriff auf eine Variabel
$color = $Objekt_Auto->farbe;
echo
"Das Auto har die Farbe" . $color . ".";

// Zugriff auf eine Methode (Funktion) des Objekts
$Objekt_Auto->bremsen(10);
?>


Neue Objekte erzeugt man also mit "new" und dem Namen der Klasse. Der Vollständigkeit halber sei hier auch das "Konstrukt" erwähnt. Das Konstrukt ist eine Funktion in einer Klasse, die den gleichen Namen trägt. Man kann direkt beim Erzeugen des Objekts das Konstrukt laden, indem man hinter dem Klassennamen die erforderlichen Werte der Funktion in Klammern angibt. Wie dies in der Praxis aussieht werden Sie bei der MySQL Klasse erfahren.

MySQL Klasse

Inzwischen wissen Sie schon sehr viel über objektorientiertes Programmieren in PHP. Genug um die folgende Klasse zu verstehen und zu erweitern.
Die Klasse enthält in ihrer jetzigen Version nur 2 Funktionen, allerdings ist sie doch recht komplex geraten, durch die Kontrollmechanismen und die Option eventuelle Fehler auszugeben.

Datei mysql.class.php:

<?php

class mysql {

var
$host = "";
var
$user = "";
var
$pass = "";
var
$database = "";
var
$persistency = false;
var
$serverid = "";
var
$error = array();

function
mysql($host, $user, $pass, $database, $persistency = false) {

$this->host = $host;
$this->user = $user;
$this->pass = $pass;
$this->database = $database;
$this->persistency = $persistency;

if(
$this->persistency) {

$this->serverid = @mysql_pconnect($this->host, $this->user, $this->pass);

}
else {

$this->serverid = @mysql_connect($this->host, $this->user, $this->pass);

}

if(!(
$this->serverid)) {

$this->error["error"] = true;
$this->error["msg"] = "Es konnte keine Verbindung zum Datenbank-Server hergestellt werden.";
return
false;

}
else {

if(
$this->database == "") {

$this->error["error"] = true;
$this->error["msg"] = "Es wurde keine Datenbank angegeben";
return
false;

}
else {

$list = mysql_list_dbs($this->serverid);

$db_exists = false;

while(
$db = mysql_fetch_object($list)) {

if(
$db->Database == $this->database) {

$db_exists = true;

}

}

if(
$db_exists == false) {

if(!(
mysql_create_db($this->database, $this->serverid))) {

$this->error["error"] = true;
$this->error["msg"] = "Datenbank konnte nicht angelegt werden.";
return
false;

}
else {

if(!(
mysql_select_db($this->database, $this->serverid))) {

$this->error["error"] = true;
$this->error["msg"] = "Datenbank konnte nicht ausgewählt werden.";
return
false;

}

}

}
else {

if(!(
mysql_select_db($this->database, $this->serverid))) {

$this->error["error"] = true;
$this->error["msg"] = "Datenbank konnte nicht ausgewählt werden.";
return
false;

}

}

}

}

}

function
shut() {

if(!(
$this->serverid)) {

$this->error["error"] = true;
$this->error["msg"] = "Verbindung konnte nicht getrennt werden, da keine besteht.";
return
false;

}
else {

@
mysql_close($this->serverid);
return
true;

}

}

}

?>


Verwendung:

<?php
// Klasse hinzuladen
include("mysql.class.php");

// Objekt erzeugen und Konstrukt laden
$sql = new mysql("localhost", "Hans", "root", "gaestebuch");

// Dauerhafte Verbindung aufbauen
$sql = new mysql("localhost", "Hans", "root", "gaestebuch", true);

// Beenden der Verbindung
$sql->shut();
?>


Vorteile der MySQL Klasse:
  • Anpassung an jedes Projekt möglich
  • übersichtlicher und leicht verständlicher Code
  • Ausschließen aller Eventualitäten (z.B. Datenbank noch nicht existent) durch das Konstrukt
  • Ausgabe von Fehlermeldungen auf Wunsch des Users
  • Alles in einer Datei


Dr.Eddison
Rookie
Beitrag vom:
28-03-2008, 10:55:10

Guter Einstieg - ausbaufähig!

Als Einstieg in die Verwendung und Erstellung von Klassen ist es ein guter Beitrag. Ich selbst stufe mich nicht als Anfänger aber auch nicht als Profi ein. Als "Fortgeschrittener" fehlen mir wichtige bzw. interessante Informationen, die nur schwer zu ergooglen sind. Z.B. (wie auch bei detaillierten Beschreibung der mySQL-Klasse) der Hinweis auf das &-Zeichen (&$anzahl) - was bewirkt das und warum ist das sowichtig?
Auch die Unterschiede beim verwenden der Klasse fehlt hier noch:
Variante 1:
<?php
include("auto.class.php");
$Objekt_Auto = new Auto;
$color = $Objekt_Auto->farbe;
?>
Variante 2:
<?php
include("auto.class.php");
Auto::bremsen(10);
?>
Da sich mir die Unterschiede noch nicht wirklich erschlossen haben und welche Konsequenzen in folge daraus entstehen, wäre es super, wenn dieses Tutorial noch erweitert werden würde.

Viele Grüße!

-----------------------------------------------------


paedubucher
Professonial
Beitrag vom:
27-03-2008, 12:06:29

<pre>-Tag

Für Quellcode verwende ich in der Regel den <pre>-Tag, damit wird der Programmcode so angezeigt, wie du ihn in deinem Texteditor eintippst.

-----------------------------------------------------



Senior Member
Beitrag vom:
07-11-2004, 18:25:48

Nein, das liegt nicht an mir. Jede Anweisung in einem IF-Block bekommt bei mir einen Zeilenvorschub.
Die Dateien highlighte ich immer mit der PHP Funktion, die dann pro Vorschub 5 No-Breaking-Spaces einfügt. Allerdings scheint die Datengröße von dann mehreren Kilobyte den Admins einfach zu groß, sodass die No-Breaking-Spaces gelöscht werden.

Soll keine Kritik darstellen, ich bin mir selbst dessen bewusst, dass man der Performace zuliebe auf sowas verzichten kann.

-----------------------------------------------------


paedubucher
Professonial
Beitrag vom:
06-11-2004, 16:32:27

Praxisnaher Einstieg

Den Artikel finde ich recht gelungen, ich finde es auch gut, dass du direkt mit einem Beispiel einsteigst. Die mySQL-Klasse wird sicherlich sehr nützlich sein.

Die mySQL Klasse hättest du vielleicht noch etwas stärker erläutern können.
Der Code sieht ausserdem sehr schlecht strukturiert aus. Man kann sich kaum orientieren, ob z.B. ein if-Block einem anderen untergeordnet ist oder nicht, das Lesen des Codes ist eher anstrengend. Ob der Fehler bei dir oder beim Portal liegt sei dahingestellt....

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04510
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06247
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1157
Comments: 0