Art von OO in PHP / Programmierstil bei großen CMS / Frameworks

Transmitter

Erfahrenes Mitglied
Hi @all!

Ich wollte mal nachfragen, wie ihr große Systeme auf OO Basis Programmiert,

- Was kommt bei euch in Klassen?

- Schreibt ihr ein reines OO System?

- Welcher Aufbau ist sinnvoll und wartungsfreundlich und performant?

Ich mache es im moment so:

/module/Administration

Da liegt eine index.php und eine Administration.Class.php ..
Die index authorisiert den User, und dann gehts in ne
switch ( $step )
die dann die Methoden der Klasse aufruft
( zb. navigation_aendern ( ), administrator_logout ( ), usw. )

In der Methode werden die Template-Variablen assigned ( smarty ) und
$content returned, der dann in der index.php per $smarty->display ..
ausgegeben wird.

Klassen wie User.Class.php habe ich nicht in einem Modulverzeichnis,
sondern in /lib/system/ weil das ganze Online System auf diese
Klasse zugreifen muss.

Sinnvoll?
Oder Verbesserungswürdig?

Es kann auch sein, dass an ein nächstes System von mir mal was anderes in die Businesslogic-Schicht kommen könnte, so in Richtung Java evtl.
Kann ich da jetzt schon was an den Schnittstellen in PHP beachten?

Ich hab mir mal Typo3 und eZpublish angeschaut .. da ist es ja ganz
anders gelöst .. wieso?
Kennt sich wer in dem OO Code von nem großen System gut aus, und
könnte ein wenig aus dem Nähkästchen plauern?

Würde mich freuen eine Diskussion zur Planung und Entwicklung hier
zu finden :)

viele grüße
transmitter
 
Ich glaube, das liegt daran, dass du im falschen Forum bist.

bei php.de gibts ein PHP-Forum für Fortgeschrittene. Dort wird über solche Dinge diskutiert.
Schade, dass hier niemand etwas darüber weiss. Dieses Thema hätte mich interessiert, da ich mich schon lange über diesen Spaghetti-Code aufrege.
Ich habe gehört, dass jemand an einem PHP.NET compiler arbeitet.

Das wäre doch ein Grund für ASP.NET
 
Original geschrieben von Sunray
Ich glaube, das liegt daran, dass du im falschen Forum bist.

bei php.de gibts ein PHP-Forum für Fortgeschrittene. Dort wird über solche Dinge diskutiert.
Schade, dass hier niemand etwas darüber weiss. Dieses Thema hätte mich interessiert, da ich mich schon lange über diesen Spaghetti-Code aufrege.
Ich habe gehört, dass jemand an einem PHP.NET compiler arbeitet.

Das wäre doch ein Grund für ASP.NET

Aha währe mir neu das OOP hier niemanden interressiert.
Zudem sunray kannst du dir gewiss sein das es hier in dem Forum eine Menge an Leuten gibt die eine Menge Ahnung haben.

Nur lässt sich Object Orientiertes Design nicht in einem Thread erklären, was diejenigen die OOD verstanden haben auch
wissen.
Darüber wurden ganze Bücher geschrieben und diese sollte mann lesen und lernen.
Es bringt dir und sonst niemanden was wenn hier jemand in 5-10 Sätzen über Model Driven Architektur spricht.

Für alle die OOP wirklich lernen wollen, macht das nicht mit PHP. Denn PHP ist keine OOP Sprache. Es lässt sich zwar manches umsetzen, aber das reicht nicht um sinnvoll OOP zu lernen.
Lernt Java / Delphi und noch 2-3 andere OOP Sprachen kennen, und schaut euch UML an.

PHP verleitet zu prozeduales Scripting weil es eine prozeduale Scriptsprache ist die ein wenig OOP kann.
So verleitet Ruby zu OOP Scripting weil es eine vollkommene Object Orientierte Scripsprache ist.
Und Java ist eine OOP Programmiersprache, also lässt sich OOP auch damit gut lernen (was auch erklärt wieso Java an allen IT Unis gelehrt wird).

PHP ist ein schönes Werkzeug aber nicht das einzige.
Wie sagte mal ein schlauer Mann im Usenet:

Wenn du nur ein Hammer als Werkzeug hast, sieht jedes Problem aus wie ein Nagel.

Um auf deine Frage zurückzukommen Transmitter.
Eine Class Administration macht kein Sinn wenn sie eine Sammlung von Methoden ist.
z.b macht der aufruf von myAdminstration->navigation_aendern() keinen Sinn.
Du uebergehst damit eigentlich einen vorteil von OOP: Die wiederverwendbarkeit von Klassen.
Faustregel: Umso umfassender eine Klasse um so weniger wiederverwendbarer.

So wirst du z.b die Klasse Administration irgendwann mal gern wieder verwenden wollen, kannst dies aber nicht da sie die Navigation fuer genau das eine Projekt aendert. Sprich du muesstest die Klasse umschreiben.
Hast du aber um bei dem Beispiel zu bleiben eine Klasse Administration und eine Klasse Navigation die du einer Instanz von Administration uebergibst so hast du hier modularität geschaffen.

$admin = new Administration();
$nav = new Navigation();
$admin->setNavigation($nav);
$admin->getNavigation()->change($newLinks);

In diesem Beispiel kannst du die Klasse Administration auch in einem anderen Projekt nutzen weil du nur die Klasse navigation änderst.
Versuche nach dem Prinzip der Zerlegung deine Klassen zu bauen.
Hilfreich ist bei der Planung genau zu erzählen was das Programm machen soll. Beispiel ein Computerspiel Tennis.

Ich habe einen Tennisplatz über den ist ein Netz gespannt. 2 Spieler stehen sich gegenüber mit einem Schläger in der Hand. Diese spielen den Ball über das Netz. Die Zuschauer applaudieren dabei.

Nimm alle Substantive und überlege dir ob sie als Object Sinn machen. Hier wuerde ich alle als Klasse programmieren, ausser die Hand, da eine Hand klasse keinen Sinn machen würde (Zu klein, zu wenig interatkion).

Schwieriger wird es etwas abstrakteres zu designen wie z.b eine Administration.
Hier hilft es sich die cases vorzustellen (also wie wird die applikation genutzt).

Der Administrator gibt Name und Passwort ein, um sich einzuloggen. Eingelogged kann er User löschen und bearbeiten. Ebenso kann er den Namen der Waren ändern. Er kann die Navigation editieren. Die User bekommen eine Gruppe zugewiesen. Es gibt die Gruppen Oberadmins, LokaleAdmins und Bearbeiter.
usw.

Daraus kannst du schon erkennen wofuer sich eine Klasse eignet, und ebenso lässt sich sogar eine Hirachy erkennen. So sieht mann gleich das es
- User
- Adminstrator
gibt. Da es sich um einen Shop handelt sicherlich auch
- Kunde
Da Administrator und Kunde letztendlich auch User sind:

class Administrator extends User
bzw
class Kunde extends User. Ebenso könnte mann sagen
Gruppen -> LokaleAdmins -> Oberadmins

Es lässt sich auch z.b erkennen. Falls du interresse hast dir Object Orientiertes Design anzulernen dann versuche das Anhand passender Bücher aufzunehmen.
Diese Bücher behandeln aber alle entwender Object Pascal oder noch öfter Java. Vieles wird dir aber auch klar beim erlernen einer OOP Sprache.

grüssse
 
Nun bitte vorsicht mit OOP, in PHP5 ändert sich da einiges, damit fällste auf die nase wenn du da nich aufpasst.. wir müssen z.B. unser komplettes CMS neu schreiben beshalb....

und zwar z.B. gab es in php4 eine undokumentierte möglichkeit klassen zu instanzieren...

$className = "myClass";
$myObject = new $className();

und dann war $myObject eine instanz der klasse myClass, nur wurde in php5 irgendwas geändert, und das funktioniert nun nicht mehr.. nun ja...

dann kommen noch die erneuerungen an der Zend2 engine dazu... konstruktoren funktionieren anders... magic methodes, classtype hints, und noch einiges mehr...


nichts desto trotz eignet sich OOP herforagend für ein CMS, weil du kannst nun her gehen und sagen, du schreibst klassen für alles uns jedes... beispielsweise schreibst du eine wraper klasse für den zugriff auf die datenbank, für sessions, für authentifikation des users, für templateverwaltung...
und wenn sich nun irgend etwas an dem server ändert, so tauscht du nur ein modul aus, und schon ist alles wieder beim alten...
beispiel: du stellt von MySQL auf PostgreSQL um... nun gehst du nur her und tascht CMySQL gegen CPostgreSQL aus, und schon funktioniert alles wieder so wie es soll..... oder angenommen du änderst etwas am templateformat... tascht du das template modul aus...

so ist sichergestellt das das CMS auch auf anderen servern total problemlos leuft
und für die instanzierung der klassen würd ich dir empfehlen den namen irgendwo global zu speichern, und mit eval eine instanz der klasse zu erzeugen, und eine referenz darauf zurück zu geben.
 
Original geschrieben von chibisuke

nichts desto trotz eignet sich OOP herforagend für ein CMS, weil du kannst nun her gehen und sagen, du schreibst klassen für alles uns jedes... beispielsweise schreibst du eine wraper klasse für den zugriff auf die datenbank, für sessions, für authentifikation des users, für templateverwaltung...
und wenn sich nun irgend etwas an dem server ändert, so tauscht du nur ein modul aus, und schon ist alles wieder beim alten...
beispiel: du stellt von MySQL auf PostgreSQL um... nun gehst du nur her und tascht CMySQL gegen CPostgreSQL aus, und schon funktioniert alles wieder so wie es soll..... oder angenommen du änderst etwas am templateformat... tascht du das template modul aus...

so ist sichergestellt das das CMS auch auf anderen servern total problemlos leuft
und für die instanzierung der klassen würd ich dir empfehlen den namen irgendwo global zu speichern, und mit eval eine instanz der klasse zu erzeugen, und eine referenz darauf zurück zu geben.

Selbst PHP5 ist immer noch nicht eine komplette umsetzung von OOP.
Dazu gabs erst ein Artikel in der iX der das ziemlich gut aufgreit.

Ein Modul auszutauschen nur wegen einem wechsel der Datenbank? Viel zu aufwendig.
Dinge wie JDBC laufen DB Unabhängig und sind dementsprechend allein durch die änderrung des Connection String änderbar.

An den beispielen die du gebracht hast ist nichts besonderes, dies ist auch bisher möglich.
Jedoch eine gescheite Kapselung ist bei PHP nicht möglich und somit fehlt ein Standbein des OOPs bei PHP.

Bei PHP5 werden grundsätzlich eine Referenz auf das Object zurückgegeben, das ist aber eine Schande das dies erst jetzt geschieht. In richtigen OOP Sprachen hast du enweder die Kontrolle wie du das object erhälst (C++) oder aber grundsätzlich
als Refernz (Java).

Klar kann mann mit PHP auch OOP programmieren, jedoch:
a) ist die Sprache nicht geeignen OOP zu lernen
b) ist bei dem Anwendungsgebiet von PHP prozeduales Programmieren oftmals besser.

Denn wenn ich eine grössere Applikation wie ein CMS programmierer, vertrau ich lieber auf um einiges Schnellere
Technologien wie .net und j2ee.
Ja selbst mit zend engine2 ist PHP vergleichsweise langsam.
Referenzen für die Aussage findest du überall im Netz.
 
Original geschrieben von Christian Fein
Ein Modul auszutauschen nur wegen einem wechsel der Datenbank? Viel zu aufwendig.
Dinge wie JDBC laufen DB Unabhängig und sind dementsprechend allein durch die änderrung des Connection String änderbar.

JDBC?
Ich kenne das von ADOdb, die engine unterstützt auch diverse Persistenzcontainer und das läßt sich per String ändern 'mysl' / 'oracle' usw.


Original geschrieben von Christian Fein
Denn wenn ich eine grössere Applikation wie ein CMS programmierer, vertrau ich lieber auf um einiges Schnellere
Technologien wie .net und j2ee.

Nemen wir mal an, ich habe vorerst nur einen SharedHostingServer zur Verfügung.
Baue da drauf ein komplexes CMS auf, das läuft gut, soll auf Performance gebessert werden und da soll eine Buisness-Logic Schicht mit j2ee drunter.
Was muss ich dafür denn bei der homogenen PHP implementation nun schon beachten?
Bzw. kann ich das schon so schreiben, dass j2ee anschließend Problemlos in das System eingepasst werden kann, oder das PHP System ersetzt werden kann?


Original geschrieben von Christian Fein
Falls du interresse hast dir Object Orientiertes Design anzulernen dann versuche das Anhand passender Bücher aufzunehmen.
Diese Bücher behandeln aber alle entwender Object Pascal oder noch öfter Java. Vieles wird dir aber auch klar beim erlernen einer OOP Sprache.

Werde mir dann noch mal ein OOD Buch zu gemüte führen.
Java und C++ kann ich mehr oder weniger schon, obwohl ich sagen muss, dass ich Java bisher "nur" während des Studiums programmiert habe, also noch nicht wirklich viel Erfahrung habe.



Original geschrieben von chibisuke
... und für die instanzierung der klassen würd ich dir empfehlen den namen irgendwo global zu speichern, und mit eval eine instanz der klasse zu erzeugen, und eine referenz darauf zurück zu geben.

Weswegen genau?
 
Original geschrieben von Transmitter
JDBC?
Ich kenne das von ADOdb, die engine unterstützt auch diverse Persistenzcontainer und das läßt sich per String ändern 'mysl' / 'oracle' usw.

Ja JDBC ähnelt ODBC ziemlich, nur mit dem Vorteil das JDBC Plattformunabhängig ist.

Original geschrieben von Transmitter

Nemen wir mal an, ich habe vorerst nur einen SharedHostingServer zur Verfügung.
Baue da drauf ein komplexes CMS auf, das läuft gut, soll auf Performance gebessert werden und da soll eine Buisness-Logic Schicht mit j2ee drunter.

Es kommt darauf an wie J2EE mit PHP kommunizieren will.
Wenn PHP letzendlich nur auf die in der Datenbank vorhandenen Datenzugreift und
die View ist, dann ist es relativ problemlos möglich.
Wenn der Servlet Container über ajp mit dem Apache verbunden ist, kann ein PHP Script SessionDaten und post bzw Get Daten auch direkt an ein Servlet weitergeben. Diese Konfiguration ist aber nicht so ganz ohne.


Original geschrieben von Transmitter

Was muss ich dafür denn bei der homogenen PHP implementation nun schon beachten?
Bzw. kann ich das schon so schreiben, dass j2ee anschließend Problemlos in das System eingepasst werden kann, oder das PHP System ersetzt werden kann?

Schwer. Ich würde mich eher fuer eine der Techniken entscheiden.


Original geschrieben von Transmitter

Werde mir dann noch mal ein OOD Buch zu gemüte führen.
Java und C++ kann ich mehr oder weniger schon, obwohl ich sagen muss, dass ich Java bisher "nur" während des Studiums programmiert habe, also noch nicht wirklich viel Erfahrung habe.

Wenn du PHP magst, versuch dich an der Servlet Programmierung. Wenn du ASP.net magst dann erst recht, denn ASP.net ist in vielem eine Kopie der Java Servlet Programmierung.

grüsse.
Ich schlage "J2EE Design Patterns" des Addisson - Wesley verlag vor. Relativ Teuer im Verhältnis zur Seitenanzahl, aber sehr lehreich.
 
Nun meineswissens gibt es JDBC nur auf Java, werd aber auf alle fälle nochmal nen blick ins PHP handbuch werfen...

.NET ? Igitt, *kotz*..ich arbeite prinzipell nur mit apache..
J2EE? nun Servlets sind sowas von lahm, das PHP dagegen noch schnell ist also... (hab die erfahrung [leider] selbst sammeln müssen)

und wie gesagt, es geht bei der modularität vor allem darum das ganze komplett server unabhängig zu machen, wenn du nun auf sachen wie JDBC odert ADOdb zurück greifst, setzt du voraus das ein server entsprechende module rein kompiliert oder extern angebunden hatt... hatt er das nicht kannst du dein system aus dem fenster werfen und nochmal von vorn anfangen..
 
Original geschrieben von chibisuke

.NET ? Igitt, *kotz*..ich arbeite prinzipell nur mit apache..
J2EE? nun Servlets sind sowas von lahm, das PHP dagegen noch schnell ist also... (hab die erfahrung [leider] selbst sammeln müssen)

PHP ist um den Factor 3 langsamer da eine komplett interpretierte Sprache.
Servlets sind in bytecode compiliert.
Den unterschied solltest du dir nochmals anlesen, ist wichtig zu verstehen.

Links für Benchmarks findest du überall im netz.

Original geschrieben von chibisuke

und wie gesagt, es geht bei der modularität vor allem darum das ganze komplett server unabhängig zu machen, wenn du nun auf sachen wie JDBC odert ADOdb zurück greifst, setzt du voraus das ein server entsprechende module rein kompiliert oder extern angebunden hatt... hatt er das nicht kannst du dein system aus dem fenster werfen und nochmal von vorn anfangen..
Also von jdbc scheinst du keine Ahnung zu haben. Denn jeder Servlet Container bietet dir JDBC Funktionalität. Um einen bestimmten Treiber zu nutzen brauchst du nichts weiter als das betreffende jar file in das web-inf/lib verzeichnis hochzuladen und per Class.forName() aufzurufen, das wars.
Mit "Module Reinkompilieren" hat das nichts zu tun. Ich empfehle dir das du dein "Wissen" mal auffrischest bevor du von etwas erzählst von dem du keine Ahnung hast.
"Extern angebunden" brauch hier rein gar nichts.
 
Zurück