Chris Hunter
Klassen, warum zum teufel benutz jemand Klassen?
Also zum ersten fällt mir ein recht triftiger grund ein, warum man Klassen benutzt. Und dieser grund ist die wiederverwendbarkeit. Ihr kennst das bestimmt alle. Einige Dinge programmiert ihr immer und immer wieder. Z.B. eine Routine/Funktion die zur datenbank verbindet, diese weider schließt oder einträge macht. Warum sollte man diesen code nicht so gestalten, das man ihn immer und immer wieder verwenden kann, ohne ihn jedes mal neu zu schreiben? oder man findet in irgendeinem forum einen armen hansel der gerade so etwas braucht? für solch einen Zweck, eben einen wiedferverwendbaren, gekapselten code, oder ein sog. Klassenmodul (*g*) bietet sich die klasse an.
die klasse ist ein unabhängiges, in sich gekapseltes stückchen funktionalität, die sich meistens sehr schnell in ein bereits vorhandenes projekt einbinden lässt. die klasse ist so definiert, das sie vergleichsweise störungsfrei in ein existierendes Projekt eingesetzt werden kann, ohne gefahr zu laufen, mit bereits benutzten funktions- und variablennamen zu kollidieren.
Wie definiere ich eine klasse, oder wie erzeuge ich ein Objekt?
Also nehmen mir einmal das beispiel was ich bereits oben angesprochen habe, und wir brauchen eine klasse, die zu einer datenbank verbindet.
angenommen, es ist eine Reihe von Funktionen für diesen zweck vorhanden, und diese Funktionen sollen in eine Klasse umgewandelt werden:
aus diesen Variablen und Funktionen wird eine Klasse, indem man vor alle verwendeten variablen das Schlüsselwort var schreibt und indem man alle Variablen und Funktionen mit einem class-Konstrukt umschließt. damit ist dieser codeteil auch vom rest des scripts gekapselt, bzw getrennt. halt ne klasse, ne. das ganze sieht dann als klasse z.b. so aus:
da wo {...} stehst ist nactürlich der inhalt der funktion einzutragen, so ganz automatisch gehts nicht
so langsam sollte das prinzip der klasse aber klar werden. und auch die macht oder die absicht zu erkennen sein, die hinter der klasse steht.
gut, ähhh. grübeln.... ja. genau. erzeugen von objekten.
dazu sollte man noch etwas wissen. eine klasse so wie sie da oben steht ist noch kein funtionierendes script. eigentlich ist es nichts weiter als ein bauplan zu einer funktionstüchtigen einrichtung. man kann also mit einer classe alleine nicht viel anfangen. ganausowenig wie man in einer blaupause einer wohnung wohnen kann. dazu muss man erst noch das haus bauen, bzw. ein objekt erzeugen. in deisem fall ist es ein object der klasse, oder des klassenbauplans DB_MiniSQL. und das geht so:
man sieht schon, wie schön wiederverwendbar eine klasse ist. diesmal in einem script, einem project.
so, jetzt schaun wir mal weiter:
das objekt $db1 der klasse kann man sich wie ein array mit einer besonderen syntax vorstellen.
Aber anstatt auf
$db1["Link_ID"] und
$db1["Error"] zuzugreifen, muß man
$db1->Link_ID und
$db1->Error verwenden.
achtet aber darauf, dass es NICHT heißt:
$db1->$Link_ID oder
$db1->$Error
das $ für die variabeln kommt immer vor das object, nicht an das element.
das waren die variabeln, die in der klasse definiert wurden. ihr erinnert euch? ein bischen weiter oben...
Auch die Funktionen in einem objekt einer klasse lassen sich so aufrufen:
$db1->connect()
$db1->query()
und so weiter....
....und so fort...
natürlich auch vom zweiten erzeugten object $db2:
$db2->connect()
$db2->query()
selbe mache...
..ist halt günstig, wenn ihr in einem script zwei db-connect machen müsst. ne klasse erspaart manchmal einiges an arbeit.
gut, was könnte man jetzt noch erklären in zusammenhang mit klassen. mmhh.. grübeln again...
ja genau vieleicht noch ganz interessant und wichtig ist das $this...
Was ist das $this? Und was mache ich damit?
innerhalb einer Funktion, z.b. wie oben schon angefangen die connect() funktion, muß auf die Variable Link_ID zugegriffen werden, um das Resultat eines Connect abzuspeichern. In connect() können wir nicht wissen, wie die Funktion nun gerade heißt, also ob ihr Name nun gerade $db1->connect() oder
$db2->connect() oder
$tausenhussassa->connect()
ist und ob die Link-ID nun in
$db1->Link_ID oder in
$db2->Link_ID
abgespeichert werden muß.
Eigentlich ist das auch egal: Wir wollen ja nur auf unsere eigene Link-ID zugreifen. also genau die link ID des objects. das gerade am werkeln ist.
$this bezeichnet nun genau unser eigenes Objekt. genau das object, das gerade angesprochen ist. im code der klasse sieht das dan ungefähr so aus:
...mhhh... den kontruktor einer klasse kann ich auch noch erklären um das ganze dann fast abzuschließen:
was ist der konstruktor, und wofür ist er gut?
Der kontruktor einer klasse ist soetwas wie eine initialisierung. ein setup. oder ja genau. das ist er. eine initialisierung.
dabei ist ein kontruktor nichts anderes als eine normale funktion innerhalb einer klasse. sie unterscheidet sich von anderen funktionen derselben Klasse nur dadurch, daß sie beim erzeugen der klasse, oder des klassenobjects mit new automatisch aufgerufen wird. also jedesmal wenn ihr
$db1 = new DB_MiniSQL;
schreibt, wird der konstruktor automatisch aufgerufen. ihr müsst also nicht jedesmal
$db1 = new DB_MiniSQL;
$db1->setup()
schreiben. ist praktisch, was? na ja ganz so praktisch isses natürlich nicht, denn ein kontruktor aufruf geht sicherlich nicht $db1->setup(). bei kontruktoren ist es in PHP nämlich so, das der kontruktor genauso heißen muss, wie die klasse selbst. in unserem fall der klasse DB_MiniSQL muss der konstruktor also auch DB_MiniSQL heißen...
...jaaaa, das ist ganz wichtig, sonst funztz es nämlich nicht!! eine klasse mit contructor sieht z.b. so aus:
es gibt noch so einiges anderes was man über funktionen schreiben könnte, aber ich will mich hier nicht unendlich auslassen. wen es interessiert kann mich ja noch wieter fragen.
ich könnte noch ein bischen über vererbung schreiben oder metainfos einer klasse, oder wie man klassden in einer session speichern kann..
..wens interessiert...
greets euer Hunter
Also zum ersten fällt mir ein recht triftiger grund ein, warum man Klassen benutzt. Und dieser grund ist die wiederverwendbarkeit. Ihr kennst das bestimmt alle. Einige Dinge programmiert ihr immer und immer wieder. Z.B. eine Routine/Funktion die zur datenbank verbindet, diese weider schließt oder einträge macht. Warum sollte man diesen code nicht so gestalten, das man ihn immer und immer wieder verwenden kann, ohne ihn jedes mal neu zu schreiben? oder man findet in irgendeinem forum einen armen hansel der gerade so etwas braucht? für solch einen Zweck, eben einen wiedferverwendbaren, gekapselten code, oder ein sog. Klassenmodul (*g*) bietet sich die klasse an.
die klasse ist ein unabhängiges, in sich gekapseltes stückchen funktionalität, die sich meistens sehr schnell in ein bereits vorhandenes projekt einbinden lässt. die klasse ist so definiert, das sie vergleichsweise störungsfrei in ein existierendes Projekt eingesetzt werden kann, ohne gefahr zu laufen, mit bereits benutzten funktions- und variablennamen zu kollidieren.
Wie definiere ich eine klasse, oder wie erzeuge ich ein Objekt?
Also nehmen mir einmal das beispiel was ich bereits oben angesprochen habe, und wir brauchen eine klasse, die zu einer datenbank verbindet.
angenommen, es ist eine Reihe von Funktionen für diesen zweck vorhanden, und diese Funktionen sollen in eine Klasse umgewandelt werden:
|
||||
aus diesen Variablen und Funktionen wird eine Klasse, indem man vor alle verwendeten variablen das Schlüsselwort var schreibt und indem man alle Variablen und Funktionen mit einem class-Konstrukt umschließt. damit ist dieser codeteil auch vom rest des scripts gekapselt, bzw getrennt. halt ne klasse, ne. das ganze sieht dann als klasse z.b. so aus:
|
||||
da wo {...} stehst ist nactürlich der inhalt der funktion einzutragen, so ganz automatisch gehts nicht
so langsam sollte das prinzip der klasse aber klar werden. und auch die macht oder die absicht zu erkennen sein, die hinter der klasse steht.
gut, ähhh. grübeln.... ja. genau. erzeugen von objekten.
dazu sollte man noch etwas wissen. eine klasse so wie sie da oben steht ist noch kein funtionierendes script. eigentlich ist es nichts weiter als ein bauplan zu einer funktionstüchtigen einrichtung. man kann also mit einer classe alleine nicht viel anfangen. ganausowenig wie man in einer blaupause einer wohnung wohnen kann. dazu muss man erst noch das haus bauen, bzw. ein objekt erzeugen. in deisem fall ist es ein object der klasse, oder des klassenbauplans DB_MiniSQL. und das geht so:
|
||||
man sieht schon, wie schön wiederverwendbar eine klasse ist. diesmal in einem script, einem project.
so, jetzt schaun wir mal weiter:
das objekt $db1 der klasse kann man sich wie ein array mit einer besonderen syntax vorstellen.
Aber anstatt auf
$db1["Link_ID"] und
$db1["Error"] zuzugreifen, muß man
$db1->Link_ID und
$db1->Error verwenden.
achtet aber darauf, dass es NICHT heißt:
$db1->$Link_ID oder
$db1->$Error
das $ für die variabeln kommt immer vor das object, nicht an das element.
das waren die variabeln, die in der klasse definiert wurden. ihr erinnert euch? ein bischen weiter oben...
Auch die Funktionen in einem objekt einer klasse lassen sich so aufrufen:
$db1->connect()
$db1->query()
und so weiter....
....und so fort...
natürlich auch vom zweiten erzeugten object $db2:
$db2->connect()
$db2->query()
selbe mache...
..ist halt günstig, wenn ihr in einem script zwei db-connect machen müsst. ne klasse erspaart manchmal einiges an arbeit.
gut, was könnte man jetzt noch erklären in zusammenhang mit klassen. mmhh.. grübeln again...
ja genau vieleicht noch ganz interessant und wichtig ist das $this...
Was ist das $this? Und was mache ich damit?
innerhalb einer Funktion, z.b. wie oben schon angefangen die connect() funktion, muß auf die Variable Link_ID zugegriffen werden, um das Resultat eines Connect abzuspeichern. In connect() können wir nicht wissen, wie die Funktion nun gerade heißt, also ob ihr Name nun gerade $db1->connect() oder
$db2->connect() oder
$tausenhussassa->connect()
ist und ob die Link-ID nun in
$db1->Link_ID oder in
$db2->Link_ID
abgespeichert werden muß.
Eigentlich ist das auch egal: Wir wollen ja nur auf unsere eigene Link-ID zugreifen. also genau die link ID des objects. das gerade am werkeln ist.
$this bezeichnet nun genau unser eigenes Objekt. genau das object, das gerade angesprochen ist. im code der klasse sieht das dan ungefähr so aus:
|
||||
...mhhh... den kontruktor einer klasse kann ich auch noch erklären um das ganze dann fast abzuschließen:
was ist der konstruktor, und wofür ist er gut?
Der kontruktor einer klasse ist soetwas wie eine initialisierung. ein setup. oder ja genau. das ist er. eine initialisierung.
dabei ist ein kontruktor nichts anderes als eine normale funktion innerhalb einer klasse. sie unterscheidet sich von anderen funktionen derselben Klasse nur dadurch, daß sie beim erzeugen der klasse, oder des klassenobjects mit new automatisch aufgerufen wird. also jedesmal wenn ihr
$db1 = new DB_MiniSQL;
schreibt, wird der konstruktor automatisch aufgerufen. ihr müsst also nicht jedesmal
$db1 = new DB_MiniSQL;
$db1->setup()
schreiben. ist praktisch, was? na ja ganz so praktisch isses natürlich nicht, denn ein kontruktor aufruf geht sicherlich nicht $db1->setup(). bei kontruktoren ist es in PHP nämlich so, das der kontruktor genauso heißen muss, wie die klasse selbst. in unserem fall der klasse DB_MiniSQL muss der konstruktor also auch DB_MiniSQL heißen...
...jaaaa, das ist ganz wichtig, sonst funztz es nämlich nicht!! eine klasse mit contructor sieht z.b. so aus:
|
||||
es gibt noch so einiges anderes was man über funktionen schreiben könnte, aber ich will mich hier nicht unendlich auslassen. wen es interessiert kann mich ja noch wieter fragen.
ich könnte noch ein bischen über vererbung schreiben oder metainfos einer klasse, oder wie man klassden in einer session speichern kann..
..wens interessiert...
greets euer Hunter