Willkommen in der Webstatt Zum Webstatt Blog und Stories
Al3x0r Al3x0r am 25.11.06 22:16

Guten Tag,

[SIZE=18]Wie schafft man den Sprung von prozeduraler zu objektorienter Programmierung?[/SIZE]

Ich habe (leider) beim erlernen von PHP den Fehler gemacht, mich nicht von anfang an mit objektorientierter Programmierung zu beschäftigen. Nun, nach circa 2-3 Jahren Erfahrung mit PHP ist es längst überfällig umzusteigen. Ich habe mir ein Buch zu PHP5, welches auch Erklärung zur OOP umfasst, gekauft. Zur Zeit ist es bei mir so, dass ich etwas anfange zu programmieren aber mir sobald ich sehe, was ich für einen Mist verzapfe (MischMasch aus Design und Programmiercode), die Lust vergeht und das soll sich ändern.
Ich habe mir das Kapitel in dem Buch und einige Webseiten (unteranderen die Wikiartikel) durchgelesen und muss sagen, ich verstehe davon nicht viel.
Das Prinzip einer Klasse ist mir klar aber ich sehe mich nicht in der Lage zu entscheiden wann eine Funktion private, public oder protected sein sollte und auch mit __construct kann ich (noch) nicht sonderlich viel anfangen. Zur Zeit wäre mir sehr daran gelegen, OOP an der Programmierung einer Template Engine zu erlernen.
[list=1]
[*]Empfiehlt sich dies ?
[*]Hat jemand Beispiele, die ein "Learning by doing" ermöglichen ?
[*]Kennt ihr vielleicht Links zum Thema OOP die evtl. auch die verschiedenen "Eigenschaften" für Funktionen erläutern?
[*]Könnte jemand den Begriff "Abstraktion" einmal ausführen, der Wikibeitrag leuchtet mir nicht wirklich ein?
[*]Sind Methoden Funktionen in einer Klasse oder habe ich das falsch verstanden ? Wenn ja, wieso heißen sie Methoden und nicht Funktionen ?
[*]Was macht der Konstruktur ? Definiert der Klassenvariablen ?
[/list=1]

Der Großteil der Fragen lässt sich mit Sicherheit mit Links beantworten. Das was ich bis jetzt gefunden habe enthält Fachbegriffe, nach denen ich dann wieder Suche und so drehe ich mich dann immer weiter im Kreis.


vielen Dank für die Füllung meiner Wissenlücken

mfg Alex

netcup.de Warum gibt es hier Werbung?
Wasili am 25.11.06 22:33

Der Konstruktor ist eine magische Funktion (symbolisieren die __). Diese Methode wird aufgerufen, wenn du die Klasse initialisierst:
$class = new Class('var');

Das, was die Klasse Clas als Parameter, wie in einer Funktion, bekommt, sind die Parameter für die Methode __construct selbst.

private/public/protected zu erklären ist einfach. "public" muss alles sein, dass auch von aussen "gesehen" werden soll. "protected" Sind alle Methoden und Variablen, die nur für das Objekt und dessen Kindern intressant sind, andere Teile des Programms aber nicht zu intressieren haben ("unwichtig"). private sind Methoden und Variablen, die nicht einmal die für Kindklassen intressant sind.

crooked am 26.11.06 09:46

naja php ist nicht so schön um oop einzusetzen.. Python, Ruby und so sind viel objektorientierter :)

Al3x0r Al3x0r am 26.11.06 12:20

Quote
Original von crooked
naja php ist nicht so schön um oop einzusetzen.. Python, Ruby und so sind viel objektorientierter :)


inwiefern hilft das hier weiter ?

sili sili am 26.11.06 12:28

Eine Klasse ist im Prinzip eine Sammlung "zusammengehörender" Funktionen. Es ist generell bei grösseren Projekten immer auf OOP zu setzen.



Sind Funktionen in Klassen zusammengefasst, werden sie Methoden genannt um die beiden auseinander zu halten.

function name() { }

class klasse {
public function name() { }
}


Wie du siehst ist es also möglich, innerhalb und ausserhalb einer Klasse dieselben Funktions- bzw. Methodennamen zu wählen. Durch die unterschiedliche Benamsung kann man diese einfach auseinanderhalten.



Der Konstruktor kann man zum Beispiel dazu verwenden, Attribute (die Variablen einer Klasse) festzulegen. Diese können am Anfang einer Klasse nur mit statischen Werten gefüllt werden.

class klasse1 {
public $var = funktion(); // FEHLERMELDUNG!
}

class klasse2 {
public $var;
public __construct() {
$this->var = funktion(); // funktioniert
}
}


Der Konstruktor wird jeweils aufgerufen wenn die Klasse initialisiert (gestartet) wird:
$klasse = new klasse2();


Bei Fragen oder Fehlern meinerseits, melden ;)

Al3x0r Al3x0r am 26.11.06 12:49

Ich habe mich nun hingesetzt und mit einer Mysql Klasse angefangen. Das Problem ist, dass ich mir die hier geposteten schon so oft angeguckt habe, dass es fast schon abschreiben ist. Mal sehen was dabei raus kommt.

edit:// Wie rufe ich den __destructor auf ?

Wasili am 26.11.06 14:58

final class DeineKlasse {
final public function __destruct() {
print "Blub";
}
}
$class = New DeineKlasse();

unset($class);


Müsste "Blub" ausgeben. Sobald alle Referenzen auf eine Funktion gelöscht sind, wird der Destruktor aufgerufen.

Al3x0r Al3x0r am 26.11.06 15:01

Hasb auch mit unset gelöst... Was beudetet der Zusatz final ?

edit:// Ok hat sich erledigt. Finale Klassen lassen sich nicht mehr vererben.

fish fish am 26.11.06 15:25

wäre einer mal bereit einen ausführlichen LEICHT verständlichen artikel über oop mit php zu scjreiben. alles was ich bis jetzt darüber gelesen haben (und das war nun mal zum allergrößten teil theorie) ist weder leicht verständlich (= angereichert mit unnötigen fachwörtern die das verstehen deutlich erschweren) noch mit guten beispielen aufbereitet.
also könnte sich jemand mal bereiterklären so eine einfürhrung zu schreiben? danke.

Christian am 26.11.06 15:31

wäre ich auch dafür :D

Al3x0r Al3x0r am 26.11.06 15:33

Können ja ein Unterforum aufmachen. Der Name "Klassenfahrt" scheint sich anzubieten :D

Dustwolf Dustwolf am 26.11.06 16:00

Da ich damals keine Antwort erhielt: Kann man eine große Klasse schreiben, oder sollten alle Seitenelemente einzelne Klassen sein und dann in klassischer Form zusammen arbeiten?

der_nic der_nic am 26.11.06 16:07

Quote
Original von Dustwolf
Da ich damals keine Antwort erhielt: Kann man eine große Klasse schreiben, oder sollten alle Seitenelemente einzelne Klassen sein und dann in klassischer Form zusammen arbeiten?

es empfiehlt sich nur die Methoden und Variablen in einer Klasse zusammen zu fassen die logischerweise zusammen gehören... und nicht einfach alles in eine Klasse, weil dann hat man ja keinen Vorteil mehr zum "normalen" Programmieren;)
aber natürlich nicht für jede einzelne Funktion eine eigene Klasse anlegen.

Dustwolf Dustwolf am 26.11.06 16:32

Das schon. Aber wäre es sinnvoll, wenn ich mir nen Template-, Datenbank-, Statistik- Class-Gerüst anlege und dann entsprechend zur aufgerufenen Seite zum Beispiel die Unterklasse Artikelsystem aufrufe.

Oder sollte die eigentliche Seite dann doch "Stand Alone" bleiben und bloß auf die Grundfunktionen als Klassen zurückgreifen?


Sprich ich könnte ja eine Grundklasse schreiben und dann alle möglichen Unterklassen für die einzelnen Seiten. So könnte ich eine Unterklasse erzeugen und diese würde automatisch über die Parameter und übergeordneten Classes die gewünschte Seite erzeugen.

Al3x0r Al3x0r am 26.11.06 16:57

Du meinst also eine Klasse, die die anderen Klassen verwaltet und je nach Parameter ansteuert ? Halt ich für sinnvoll.

Al3x0r Al3x0r am 01.12.06 15:41

Habe grade eine Tempalteklasse gefunden ( hier ). Ist die Umsetzung so empfehlenswert ? Lohnt es sich, die Klasse weiter anzugucken ? Und vorallem kann man das irgendwie so machen, dass man nicht jeden Variable einzeln ersetzen muss, sondern das das in einer Art Automatismus geschieht ?

Thx for help

mfg alex

mab mab am 01.12.06 17:02

ich denke die Klasse ist ein gutes Beispiel. Es würde meiner Meinung nach nicht viel Sinn machen die Variablen in einem Ruck zu ersetzen. Eigentlich könntest du das auch in ein array reinhauen und dann über den Key ersetzen, in etwa so:

str_replace(array_keys($array), array_values($array), $this->content);

Aber das stört nur die Übersicht, finde ich. Vielleicht gibts ja noch eiinen besseren Vorschlag.

Übrigens würde ich eine einfache Template Klasse auch nur für ein kleines Projekt einsetzen. Ansonsten kannst dir auch gleich Smarty oder ähnliches anschauen. Da gibts gleich caching und weiß Gott was dazu :D

Al3x0r Al3x0r am 01.12.06 17:14

Irgendwie denke ich hat es Sinn sich mal Smarty anzugucken.... Das Projekt wird doch etwas komplexer ....
danke

mfg alex

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt