Auf dieser Seite erhalten Sie so viel Grundwissen, wie es nötig ist, um die allereinfachsten Programme in einer objektorientierten Sprache verstehen zu können. Während sich alles, was über dieses Grundwissen hinausgeht, in deutlich kleineren und leichter verdaulichen Portionen servieren lässt, ist dieser Abschnitt erst einmal ein sehr harter Brocken. Lassen Sie sich aber nicht einschüchtern - es lohnt sich!
Wichtig: Viel Information ist in den Programmkommentaren verpackt, Sie sollten also gerade diese Kommentare besonders sorgfältig lesen und mit dem Programmcode vergleichen! Programmkommentare sehen so aus:
/* Ein C/C++/Java/JavaScript/PHP-Kommentar, der sich über mehrere Zeilen erstrecken kann. Er fängt dort an, wo der Slash / und der Stern * stehen, und hört dort auf, wo das umgekehrte Muster steht. Beachten Sie, dass man diese Kommentare nicht ineinanderschachteln kann! */ // Ein C++/Java/JavaScript/PHP-Kommentar, der vom Doppelslash // bis zum Ende der Zeile // reicht. # Ein Perl/PHP-Kommentar, der vom Gartenhag # bis zum Ende der Zeile reicht.
Um die Übersichlichkeit zu verbessern, sind die Kommentare im Programmcode orange hervorgehoben.
Eine Variable ist ein Ort, um etwas abzuspeichern. Dieses Etwas ist in den einfachsten Fällen eine Zahl, ein einzelnes Textzeichen oder eine Folge von Textzeichen, die Zeichenkette (engl. string) genannt wird.
Für die Bildung von Variablennamen für eigene Variablen gelten in C, C++, Java, JavaScript, Perl und PHP folgende Regeln:
FOO, fOO und FoO sind verschieden!In Perl und PHP muss zudem allen Variablen noch ein Dollarzeichen vorangestellt werden. In C, C++, Java und JavaScript ist darauf zu achten, dass die Variablennamen keine Befehlswörter der Sprache darstellen.
Beispiele für korrekte eigene Variablennamen (C/C++/Java/JavaScript):
a, b, _x, b1, R2D2, Meine_erste_Variable
Beispiele für korrekte eigene Variablennamen (Perl/PHP):
$a, $b, $_x, $b1, $R2D2, $Meine_erste_Variable
Beispiele für ungültige eigene Variablennamen (C/C++/Java/JavaScript):
1, 1b, _ä, b-1, R2!D2, Meine erste
Variable
Beispiele für ungültige eigene Variablennamen (Perl/PHP):
$1, $1b, $ä, $b-1, $R2!D2, $Meine erste
Variable
Anmerkung: In Perl gibt es einige vordefinierte Variablen, die diesen Regeln nicht gehorchen.
In allen gebräuchlichen Programmiersprachen werden Zuweisungen mit dem Gleichheitszeichen
= dargestellt.
Beispiele in JavaScript:
var a, b, c, d, s, t;
// Diese Zeile besagt, dass wir vor haben, die Variablen a, b, c, d, s und t zu benutzen.
// Obwohl solche Deklarionen im Gegensatz zu strengen Sprachen wie C, C++ und Java
// in JavaScript nicht obligatorisch sind, sind sie der Übersicht wegen doch
// sehr empfehlenswert.
a = 5; // a wird 5 gesetzt
b = a; // b wird auch 5
c = a + b; // c wird 10
d = c - 3.3; // d wird 6.7
b = b - 2; // b wird 3
s = 'Hallo!'; // In JavaScript kann auch eine einfache Variable ein ganzes
// Textstück enthalten.
s = "Hallo!"; // Textstücke werden in einfache oder doppelte
// Anführungszeichen eingeschlossen.
t = '0'; // t enthält das Zeichen für die Ziffer 0.
a = t + 1; // a ist jetzt 1, wie man es erwarten würde
In PHP oder Perl fehlt gegenüber JavaScript die Deklarationszeile, und allen Variablen wird ein Dollarzeichen vorangestellt:
$a = 5; # a wird 5 gesetzt
$b = $a; # b wird auch 5
$c = $a + $b; # c wird 10
$d = $c - 3.3; # d wird 6.7
$b = $b - 2; # b wird 3
$s = 'Hallo!'; # In Perl und PHP kann auch eine einfache Variable ein ganzes
# Textstück enthalten
$s = "Hallo!"; # Auch hier sind doppelte Anführungszeichen möglich.
$t = '0'; # t enthät das Zeichen für die Ziffer 0.
$a = $t + 1; # a ist jetzt 1, wie man es erwarten würde
Eine Funktion ist ein Programmcodeabschnitt, der eine bestimmte Aufgabe erledigt. Durch einen Funktionsaufruf sorgt man dafür, dass der gewünschte Programmabschnitt ausgeführt wird. Vielen Funktionen muss man beim Aufruf eine oder mehrere Variablen (Parameter) übergeben, die den Ablauf der Funktion beeinflussen. Einige Funktionen geben auch einen Wert zurück, und dieser Rückgabewert ist das einzig Interessante, das die Funktion liefert. Bei anderen Funktionen steht die Arbeit, die diese erledigen, im Vordergrund, und solche Funktionen geben teilweise keinen Wert zurück, oder nur einen, der eine Aussage darüber macht, ob die Aufgabe erfolgreich erledigt werden konnte.
Etliche Funktionen sind so wichtig, dass sie innerhalb einer Programmiersprache verfügbar sind, ohne dass man sie selbst schreiben muss. Dazu gehören zum Beispiel die Funktionen, mit denen man einen Text ausgibt. Um etwa den Text The Force be with you! auszugeben, schreibt man
in JavaScript:
document.writeln("The Force be with you!");
// document ist die Klasse, zu der die Funktion writeln() gehört.
und in Perl oder PHP
print("The Force be with you!\n");
// print() erzeugt kein Zeilenumbruchzeichen wie writeln() aus JavaScript.
// Daher wird der Zeilenumbruch hier durch die Zeichenfolge \n erzeugt, die
// auch in C, C++, Java, JavaScript und Perl für den Zeilenumbruch steht.
Wenn Sie innerhalb eines Programmes eine Aufgabe (z.B. eine Berechnung) immer wieder erledigen müssen, sollten Sie den dazu erforderlichen Programmcode nicht jedesmal wieder neu einfügen, sondern diesen Programmcode ausserhalb des Hauptprogramms als Funktion aufschreiben, die Sie überall, wo die Aufgabe zu lösen ist, aufrufen.
Im folgenden Beispiel schreiben und benutzen wir eine Funktion zur Berechnung des Bodymass-Indexes. Diesen Index erhält man, indem man die das Körpergewicht in kg durch das Quadrat der Körpergrösse in m dividiert. Mit Hilfe des Bodymass-Indexes lässt sich eine Aussage darüber machen, ob eine Person unter-, normal- oder übergewichtig ist. Er lässt sich allerdings nur auf vollständig ausgewachsene Personen anwenden. Im Programm wird der Bodymass-Index von drei Personen ausgegeben, die 48 kg, 63 kg und 90 kg schwer sind, und (in der gleichen Reihenfolge) 1.52 m, 1.71 m und 1.69 m gross sind.
Der vollständige Programmcode (allerdings ohne XHTML- und CSS-Validierung) dieses Beispiels lautet in JavaScript (siehe auch die lauffähige Version:)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Bodymass-Index in JavaScript</title>
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>
<script type="text/javascript">
<!--
var bmi1, bmi2, bmi3; // nicht obligatorisch, aber empfehlenswert
bmi1 = bmi(48, 1.52); // 1. Aufruf der Funktion bmi()
bmi2 = bmi(63, 1.71); // 2. Aufruf der Funktion bmi()
bmi3 = bmi(90, 1.69); // 3. Aufruf der Funktion bmi()
document.writeln("Eine 48 kg schwere und 1.52 m grosse Person hat den Bodymass-Index " + bmi1 +".<br />");
document.writeln("Eine 63 kg schwere und 1.71 m grosse Person hat den Bodymass-Index " + bmi2 +".<br />");
document.writeln("Eine 90 kg schwere und 1.69 m grosse Person hat den Bodymass-Index " + bmi3 +".<br />");
/* Hier wird dreimal die bereits bekannte Funktion writeln() benutzt.
Die ausgegebene Zeichenkette wird hier innerhalb der Klammern
erst durch die beiden Pluszeichen aus drei einzelnen Zeichenketten
zusammengesetzt, wobei die Zahl bmi1 (bzw. bmi2 oder bmi3)
automatisch in eine Zeichenkette umgewandelt wird.
*/
function bmi(masse, groesse) {
/* Definition der Funktion bmi, mit der der Bodymass-Index
aus den Werten masse und groesse berechnet wird.
Die Parameter werden, durch Kommata getrennt, hinter dem
Funktionsnamen aufgelistet. Beim Aufruf der Funktion z.B.
mit bmi(48, 1.52) ist es wichtig, die Reihenfolge der
Parameter einzuhalten. */
return Math.round(masse / (groesse * groesse));
/* Auf den Befehl return folgt der Rückgabewert.
Dieser Rückgabewert wird nicht durch eine Variable sondern
durch einen Ausdruck dargestellt, der vor der Rückgabe noch
ausgewertet werden muss. round() rundet auf die nächste
ganze Zahl. Es ist eine Funktion der Klasse Math. */
}
//-->
</script>
</p>
</body>
</html>
In PHP lautet das Programm (siehe auch die lauffähige Version und den Originalquellcode):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Bodymass-Index in PHP</title>
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>
<?php
$bmi1 = bmi(48, 1.52); // 1. Aufruf der Funktion bmi()
$bmi2 = bmi(63, 1.71); // 2. Aufruf der Funktion bmi()
$bmi3 = bmi(90, 1.69); // 3. Aufruf der Funktion bmi()
print("Eine 48 kg schwere und 1.52 m grosse Person hat den Bodymass-Index $bmi1<br />\n");
print("Eine 63 kg schwere und 1.71 m grosse Person hat den Bodymass-Index $bmi2<br />\n");
print("Eine 90 kg schwere und 1.69 m grosse Person hat den Bodymass-Index $bmi3<br />\n");
/* Durch den Dollar sind $bmi1, $bmi2 und $bmi3 sofort
als Variablen erkennbar und werden innerhalb der Zeichenkette
automatisch durch ihre Werte ersetzt (man nennt das
Variablen-Interpolation). Wollte man das verhindern,
müsste man die Zeichenkette entweder durch einfache
Anführungszeichen kennzeichnen:
print('Eine 48 kg schwere und 1.52 m grosse Person hat den Bodymass-Index $bmi1<br>\n');
oder dem Dollar einen Backslash voranstellen:
print("Eine 48 kg schwere und 1.52 m grosse Person hat den Bodymass-Index \$bmi1<br>\n");
Im vorliegenden Fall wäre das aber natürlich unsinnig.
*/
function bmi($masse, $groesse) { // Funktionsnamen beginnen auch in Perl oder PHP ohne $
return round($masse / ($groesse * $groesse));
}
?>
</p>
</body>
</html>
Um dieses PHP-Programm ablaufen zu lassen, muss man es unter einem Namen abspeichern,
der auf .php endet, und es dann auf einen Webserver laden. Da das Programm
vom Webserver (und nicht vom Browser) ausgeführt wird, läuft es nicht, wenn man es
auf dem lokalen Computer mit einer URL lädt, die mit file: beginnt.
Jedes Ding, um das sich ein Programm kümmert, sei es nun innerhalb oder ausserhalb des Computers, kann als Objekt aufgefasst werden.
Die Idee des objektorientierten Programmierens besteht darin, Programme so zu strukturieren, dass die Eigenschaften eines Objekts, sowie die Operationen, die man mit und an einem solchen Objekt unternehmen kann, in Untereinheiten des Programms gebündelt sind. Diese Untereinheiten werden Klassen genannt.
Objekte, die zur gleichen Klasse gehören, werden durch die gleichen Eigenschaften beschrieben und bieten die gleichen Operationen an. Eine Klasse ist also ein Modell für ein Objekt, und die Objekte einer Klasse sind deren konkrete Ausführungen. Man nennt Objekte daher auch Instanzen einer Klasse.
Während in Java jeder Teil eines Programms einer Klasse angehört, dient in C++, JavaScript, Perl und PHP der normale Programmcode ausserhalb aller Klassen dazu, die Beziehungen und Operationen zwischen den Objekten der Klassen zu steuern.
In Java und JavaScript sind vordefinierte Klassen Teil des Sprachstandards, und es ist nicht möglich, sinnvolle Programme zu schreiben, ohne auf diese Klassen (bzw. ihre Objekte) zuzugreifen. In C++ und Perl gehören vordefinierte Klassen nicht zum eigentlichen Sprachumfang, es können aber Klassen aus Bibliotheken (Bibliotheken sind Dateien mit Programmstücken, die man in eigenen Programmen benutzen kann) geladen werden. In PHP sind Klassen bislang eine ausschliesslich freiwillige Angelegenheit.
Die ersten objektorientierten Programmiersprachen entstanden Ende der achziger Jahre. Bei vielen dieser Sprachen ist die Entwicklung noch nicht abgeschlossen.
Ein Programm, das mit Rechtecken zu tun hat, kann eine Klasse Rechteck
benutzen. Die Eigenschaften eines Rechtecks sind seine Länge und seine Breite;
wenn man wollte, könnte man sich weitere Eigenschaften überlegen (Farbe,
Orientierung im Raum, ...). Die Klasse Rechteck legt fest, was zur
Definition eines Rechtecks gehört (eben Länge und Breite), und sie
definiert die Operationen, die an und mit dem Rechteck durchgeführt werden
können. Solche Operationen könnten sein: Berechnung der Fläche,
Ändern der Länge und Ändern der Breite. Darüberhinaus braucht
die Klasse Rechteck eine Vorschrift dafür, wie man ein Objekt der
Klasse Rechteck erzeugt, nämlich, indem man anfänglich die Länge und
die Breite des Rechtecks festlegt. Diese Vorschrift nennt man den Konstruktor
der Klasse. Innerhalb der Klasse ist der Konstruktor diejenige Funktion,
die den gleichen Namen hat wie die Klasse selbst.
Objekte werden wie primitive Datentypen in Variablen gespeichert. Diese Variablen
müssen wie alle anderen Variablen auch zuerst einmal einen Wert zugewiesen bekommen.
Während man nun eine Variable, die einen primitiven Datentyp enthält, einfach
durch eine Zuweisung initialisiert (z.B. int a = 3;), muss zur Initialisierung
einer Objektvariablen der Konstruktor der Klasse aufgerufen werden. Um den Aufruf eines
Konstruktors von einem gewöhnlichen Funktionsaufruf zu unterscheiden, benutzt man
in allen objektorientierten Sprachen den Befehl new.
Die folgenden Programme in JavaScript und PHP definieren jeweils eine Klasse
namens Rechteck, erzeugen zwei Objekte namens rechteck1
und rechteck2 aus dieser Klasse und berechnen deren jeweilige Fläche.
Damit man sie gleich ausführen kann, wurden sie in eine HTML-Seite eingebettet.
FlaechenJS.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Rechtecksklasse in JavaScript</title>
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>
<script type="text/javascript">
<!--
rechteck1 = new Rechteck(2, 4);
rechteck2 = new Rechteck(4.5, 8);
A1 = rechteck1.flaeche();
A2 = rechteck2.flaeche();
document.writeln("Die Fläche von rechteck1 ist " + A1 +".<br />");
document.writeln("Die Fläche von rechteck2 ist " + A2 +".<br />");
/* Die Funktion writeln gehört zur vordefinierten Klasse document. */
function Rechteck(l, b) { // Der Konstruktor der Klasse Rechteck
this.laenge = l; // Die Variable laenge in diesem Objekt auf l setzen
this.breite = b; // Die Variable breite in diesem Objekt auf b setzen
this.flaeche = Rechteck_flaeche;
/* Damit JavaScript weiss, dass die Funktion Rechteck_flaeche()
als Methode namens flaeche() der Klasse Rechteck zu gebrauchen ist,
muss man ihr das ausdrücklich sagen. Das passiert in dieser Zeile.
JavaScript verhindert nicht automatisch, dass die Funktion
Rechteck_flaeche() auch von anderswo aufgerufen
wird, obwohl das höchstwahrscheinlich unsinnig ist.
*/
}
function Rechteck_flaeche() {
return (this.laenge * this.breite);
/* Sinnvoll, wenn zuerst in der Klasse Rechteck
this.flaeche = Rechteck_flaeche;
festgelegt wurde, und danach die Funktion als Methode eines
Objekts der Klasse Rechteck aufgerufen wird
(z.B. als rechteck1.flaeche()).
Missbräche sind allerdings nicht auszuschliessen.
*/
}
//-->
</script>
</p>
</body>
</html>
Flaechen.php (Original-Quellcode)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Rechtecksklasse in PHP</title>
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>
<?php
$rechteck1 = new Rechteck(2, 4);
$rechteck2 = new Rechteck(4.5, 8);
$A1 = $rechteck1->flaeche();
$A2 = $rechteck2->flaeche();
print("Die Fläche von rechteck1 ist $A1.<br>\n");
print("Die Fläche von rechteck2 ist $A2.<br>\n");
class Rechteck {
var $laenge, $breite;
/* Variablen einer Klasse können (im Gegensatz zu
anderen Variablen) in PHP deklariert werden. Damit wird
sichtbar, welche Variablen zu einer Klasse
gehören. */
function Rechteck($l, $b) { // Der Konstruktor
$this->laenge = $l; // wie in JavaScript, nur,
$this->breite = $b; // dass statt dem . ein -> steht
}
function flaeche() {
return ($this->laenge * $this->breite); // auch wieder fast JavaScript.
} // Allerdings steht die Funktion flaeche()
} // innerhalb der Klassendefinition.
?>
</p>
</body>
</html>