OOP mit PHP

Was sind die Vorteile von objekt orientierten Programmieren in PHP?

Ich würde sagen, da die Seite einmalig geladen wird, sind Objekte in 99% der Fälle sinlos, da deren Aufgabe auch von funktionen übernommen werden können.

Oder können die über die Erstellung der Seite hinaus weiter ‚leben‘?
Das heißt: Seite a.php wird geladen. Jemand klickt auf einen link zu Seite b.php
und ein Objekt, das auf Seite a.php oder noch früher erstellt wurde ist auf b.php weiterhin verfügbar.
Wenn ja wie werden die Objekte übergeben? per Sesion ID, per Post?

Kann mir jemand ein Beispiel nennen?
Wo kann man OOP/PHP sinnvoll einsetzen?

Gruß Thomas

Wenn ja wie werden die Objekte übergeben? per Sesion ID, per
Post?

z.b. per session, das ist richtig. du kannst sie auch selbst serialiseren und speichern. das wird sich aber meist nciht lohnen.

ein grosser vorteil von objekten ist, dass du code und namensraeume abgrenzen kannst und dich nicht auf globals oder unzaehlige funktionsparameter beziehen musst.

Hallo Tom.

Was sind die Vorteile von objekt orientierten Programmieren in
PHP?

Deine Frage müsste eigentlich lauten, was sind die Vorteile
von objekt-orientiertem gegenüber prozeduralem Programmieren.
Das hat erst mal sehr wenig mit der Sprache zu tun, sondern
ist eine Frage, wie Du an das Programmierproblem prinzipiell
herangehst.

Wenn Englisch für Dich kein Problem ist, leg ich Dir diesen
Link ans Herz:

http://www.oreilly.de/catalog/hfjava2/chapter/ch02.pdf

Dort geht es um einen Programmierwettbewerb zwischen einem
prozeduralen und einem objektorientierten Programmierer.
Danach wirst Du verstehen, was es mit der Objektorientierung
auf sich hat.

Gruß,
-Andreas.

Deine Frage müsste eigentlich lauten, was sind die Vorteile
von objekt-orientiertem gegenüber prozeduralem Programmieren.

Klar, bei sprachen wie Java sehe ich die Vorteile des OOP.
Aber bei PHP denke ich das dies ein gesonderter Fall ist.
Deswegen kann man das nicht allgemein betrachten.

Oder nehmen wir mal ne Sprache wie Pascal, in der man sowohl OOP als auch prozedual Programieren kann.
Besonders wenn GUI programmiert ist OOP bei Pascal(Lazarus,Delphi,…) im Vorteil(oder müsste ich hier Komponentenorrientiert sagen??)

Aber bei PHP…
Ne Webseite wird ja einmalig erstellt.
Wenn mein Objekte jetzt einmalig erstellt werden und nach Seitenübergabe an den Browser(Client) nicht mehr existiert, bringt es mir nichts.

Was bringt mir es wenn ich z.B.

[...]
$tante=new familienmitglied();
$onkel=new familienmitglied();
$neffe=new familienmitglied();

[..]

echo "Tante:
Name: $tante-\>name
Alter: $tante-alter";

schreibe?

Hier were ne Funktion oder Array-Variable… sinnvoller.

Ich sehe daher die Vorteile in OOP/PHP nur, wenn ich die Objekte übergeben kann(aber auf einfache Weise, ohne Serializer, oder sowas)?
Es soll also in der Datei nicht nochmal soetwas stehen, wie:

$tante=new fammitglied();
$tante-\>alter=$\_GET[Tantenalter]; [...]

Sondern etwa soetwas(Ich habe keine Ahnung, wie man Objeket in die Sesion sichert, deswegen kommt hier etwas rein Schematisches)
a.php:

$a=new blahhh();
[...]

objects.saveToSession;
?\>

b.php:

objects.loadFromSession
[...]

objects.saveToSession;
?\>

schon mal dran gedacht, dass Du in einem Script auch komplexe Abläufe handeln kannst?

z.B. bei der Grafikerzeugung oder wenn ein Script ein anderes includiert um dessen funktionen und in dem Fall Klassen nutzen zu können?

Deine Sichtweise beschränkt sich m.E. nach zu sehr auf „gewöhnliche“ Webseiten - nichts dynamisches…
Versuch mal eine Datei zur Abholung und Verwaltung Deiner emails zu schreiben und wenn Du dann zur Erkenntnis kommst, dass es da so etwas gibt wie einen imap-stream, den Du quasi in jedem imap-Befehl brauchst, dann wirst Du auch wieder die Vorteile der OOP erkennen.
Besonders wenn Du Dein Script auf mehrere Mailboxen erweiterst…

Hallo Tom.

Deine Frage müsste eigentlich lauten, was sind die Vorteile
von objekt-orientiertem gegenüber prozeduralem Programmieren.

Klar, bei sprachen wie Java sehe ich die Vorteile des OOP.
Aber bei PHP denke ich das dies ein gesonderter Fall ist.
Deswegen kann man das nicht allgemein betrachten.

*grübel* Warum die PHP-Community sich dann wohl so angestrengt
hat, OO einzuführen …

Aber bei PHP…
Ne Webseite wird ja einmalig erstellt.
Wenn mein Objekte jetzt einmalig erstellt werden und nach
Seitenübergabe an den Browser(Client) nicht mehr existiert,
bringt es mir nichts.

Das gleiche Problem hast Du doch prozedural auch.
Du musst dort auch aus Deinen POST oder GET-Parametern
eine Dir genehme Datenstruktur basteln.

Was bringt mir es wenn ich z.B.

$tante=new familienmitglied();
$onkel=new familienmitglied();
$neffe=new familienmitglied();
echo „Tante:
Name: $tante->name
Alter:
$tante-alter“;schreibe?

Hier were ne Funktion oder Array-Variable… sinnvoller.

Wieso? Der Zugriff auf eine Array-Variable zementiert
die Art und Weise, wie Du die Daten ablegst. Wenn Du
ein Objekt hast, welches Du per
$objekt->getHochInteressantesAttribut() abfragen und
mit $objekt->setHochInteressantesAttribut() schreiben kannst,
brauchst Du als Aufrufer die interne Datenstruktur nicht
zu kennen.

Wenn Du dann später was ergänzen musst und feststellst,
dass Du z.B. statt einem Array doch besser einen Hash
verwendest, stört es Deinen OO Code überhaupt nicht,
Deinen prozeduralen Code, der in Deinem Array herumfischt
aber sehr wohl, Stichwort Datenkapselung!

Ein weiteres Problem mit prozeduralem Code ist die Organisation
von mehreren Varianten eines komplexen Datentyps
(z.B. Familienmitglied). In der OO erzeugst Du einfach
je eine neue Instanz dieses Datentyps - tante, onkel, neffe -
und brauchst Dich um Namensraumkonflikte nicht kümmern.

Wenn Du das ganze aber prozedural machst, musst Du Dir in
Deiner Datenstruktur eine ID mitführen, um auf die spezielle
„Instanz“ zugreifen zu können. Mit anderen Worten die
Mehrfachinstanzen musst Du in der prozeduralen Welt selbst verwalten,
in der OO-Welt bekommst Du das Feature gratis geliefert und kannst
Dich um Dein eigentliches Problem kümmern.

Ich sehe daher die Vorteile in OOP/PHP nur, wenn ich die
Objekte übergeben kann (aber auf einfache Weise, ohne
Serializer, oder sowas)?

Da frag mal jemanden, der sich besser mit PHP auskennt als ich.
Meine Meinung ist weiterhin, dass die Vorteile der OO
unabhängig von der Programmiersprache sind :wink:

Gruß,
-Andreas.

Hallo Tom.

Du kannst in PHP ohne Probleme auch ganze Klassen in einer Session ablegen! Die einzige Voraussätzung ist, dass du die Klassendefination im nächsten Skript machst, bevor du die Daten aus der Session wieder ladest! Aber wirklich trivial ist das nicht :wink:

Ein gutes Beispiel hab ich in meiner Datenbankverbindung für OOP gefunden!
Ich habe zwei mySQL-Datenbank von denen Daten gelesen werden und wenn ich nun diese über die normalen funktionen realisiere, müsste ich aufpassen, das ich immer die richtige ConnectionID mitübergebe!
Aus diesem Grund habe ich meine Datenbankanbindung so gemacht:

<?php class database<br />{
 $ConnId = 0;

 function query($Sql)
 {
 mysql\_query($Sql,$ConnID);
 }
 .....
 function close()
 {
 mysql\_close($ConnId);
 }

}

$db1 = new Database();
$db2 = new Database();
....
$result = db1-\>query($Sql);

?\>

Später dann habe ich die Klassen so ausgebaut, dass ich auch ohne Probleme auf eine MS SQL, Informix oder Oracle Datenbank umsteigen kann, ohne einen Code neu zu implementieren zu müssen!
Auch der Ausbau für Logfiles war dann ohne Probleme für ALLE Datenbankverbindungen in einem Zug gemacht und wieder nur die eine Klasse zu ändern!

Das würde in keiner Sprache ohne OOP möglich sein! :wink:

Hoffe dies hat dir ein gutes Beispiel für den Verwendungszweck gegeben!

LG Matthias

Jetzt versteh ich, wie mann OOP richtig einsetzt
Erstmal Danke an alle für eure Zahlreichen Tipps.

Wenn ich ne Klasse in der Session speicher,muss ich also immer in jede datei class{…} schreiben, oder alterntiv ne datei classes.php anlegen, die von allen seiten includiert wird?

Gibt es ne möglichkeit alle variablen in die Session zu speichern?

Zum Bleistift:

Ich habe:

$a=12
$b=‚hallo‘;
$c=new testobjekt();

Dann rufe ich auf:

saveVarsToSession();

(Rein fiktivie Funktion)
Es soll auf jedenfall $a=$_SESSION[‚a‘], $b=$_SESS…[‚b‘] … gesetzt werden.
saveVarsToSession() soll aber funktionieren, ohne dass ich weiss,
welche Variablen überhaupt vorhanden sind.

Das auslesen dürfte kein grösseres Problem sein, oder?
ich müsste nur wissen, wie ich an die arraynamen komme.
Sprich, wenn ich ne variable $arr[‚bla‘]=‚blub‘ habe, möchte ich wissen, wie man an ‚bla‘ kommt?!?!?!