Organisation von OOP mit PHP5 (Java?)
Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 09:52:42 von Karsten Wutzke
1 Wie sollten in PHP die Klassen/Dateien gehandelt werden? Eine Klasse
pro PHP-Datei wie in Java?
2 Sollte man die Funktions-Namenskonventionen (Methoden) mit
underscore (function get_age_group() etc.) aufrecht erhalten oder eher
zum Java-Style übergehen (function getAgeGroup() etc.)? Würde ja Sinn
machen, da z.B. für die MySQL-OOP-Schnittstelle auch dieselben
Funktionsnamen existieren...
3 Wie werden die OOP-Dateien am besten organisiert, sprich, wie sähe
der Verzeichnisbaum aus, auch im Hinblick auf die require-Anweisungen?
In Java gibt es ja packages, dort kann ich ja in einem z.b.
src-Unterverzeichnis alle Dateien in einem Verzeichnisbaum lagern und
mit den imports auch für tiefer in der Datei- bzw. Packagehierarchie
gelegene Klassen/Dateien imports aus übergeordneten Paketen holen.
Für mich stellt sich z.B. die Frage, ob sowas
require_once("SelbeEbene.php")
require_once("../EineEbeneDrueber.php")
require_once("../../ZweiEbenenDrueber.php")
Sinn macht. Legt man die 'include'-Dateien in z.b. ein
"classes"-Unterverzeichnis? Oder in ein "include"-Verzeichnis?
Ich suche so nach Art "best practices für PHP5-OOP"...
Danke im Voraus
Karsten
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 10:19:09 von Michael Jostmeyer
Hi Karsten,
Karsten Wutzke schrieb:
> 1. Wie sollten in PHP die Klassen/Dateien gehandelt werden? Eine Klasse
> pro PHP-Datei wie in Java?
Würde für den Entwickler Sinn machen. Außerdem nenne ich die Datei immer
genau Klassenname.php, dann kann ich die per __autoload ganz einfach
nachladen und brauche nie ein require_once, außer in der __autoload.
> 2. Sollte man die Funktions-Namenskonventionen (Methoden) mit
> underscore (function get_age_group() etc.) aufrecht erhalten oder eher
> zum Java-Style übergehen (function getAgeGroup() etc.)? Würde ja Sinn
> machen, da z.B. für die MySQL-OOP-Schnittstelle auch dieselben
> Funktionsnamen existieren...
Interessante Frage. Letztendlich macht es ja keinen Unterschied, aber
ich nutze aus Gewohnheit immer die Version ohne Unterstriche (Semikolons
und geschweifte Klammern sind genug Sonderzeichen ;) )
> 3. Wie werden die OOP-Dateien am besten organisiert, sprich, wie sähe
> der Verzeichnisbaum aus, auch im Hinblick auf die require-Anweisungen?
> In Java gibt es ja packages, dort kann ich ja in einem z.b.
> src-Unterverzeichnis alle Dateien in einem Verzeichnisbaum lagern und
> mit den imports auch für tiefer in der Datei- bzw. Packagehierarchie
> gelegene Klassen/Dateien imports aus übergeordneten Paketen holen.
Leider gibt es in PHP keine Namespaces, hat es mal ganz kurz gegeben,
wurden dann aber wieder entfernt...
Daher ist es Sache des Entwicklers, seine Klassen in einem vernünftigen
Verzeichnisbaum zu hinterlegen. Ein "classes"-Verzeichnis ist hier auf
alle Fälle ein Minimum. Wie gesagt, ein require taucht bei mir in keiner
Klassendatei auf, das übernimmt die __autoload, welche im Hauptskript
implementiert ist.
Gruss Josi
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 10:37:31 von Ulf Kadner
Karsten Wutzke schrieb:
> 1. Wie sollten in PHP die Klassen/Dateien gehandelt werden? Eine Klasse
> pro PHP-Datei wie in Java?
Anzusteben ist es ja. Aber wohl eher um die Übersicht zu wahren.
> 2. Sollte man die Funktions-Namenskonventionen (Methoden) mit
> underscore (function get_age_group() etc.) aufrecht erhalten oder eher
Methoden sollten grundsätzlich anders gehandelt werden. Irgendwo auf
php.net stehen auch die Coding Guidlines von PHP. Kannste Dich dran
halten oder neue entwerfen. Bleibt Dir überlassen. Sinnvollerweise
sollte man sich aber schon an etwas halten. :-)
> 3. Wie werden die OOP-Dateien am besten organisiert, sprich, wie sähe
> der Verzeichnisbaum aus, auch im Hinblick auf die require-Anweisungen?
Seltsame Frage! Einfach das einbinden was Du brauchst. Wie Du das
strukturieren kannst hängt von sehr vielen Faktoren ab.
> Für mich stellt sich z.B. die Frage, ob sowas
>
> require_once("SelbeEbene.php")
> require_once("../EineEbeneDrueber.php")
> require_once("../../ZweiEbenenDrueber.php")
>
> Sinn macht.
Wenn Du diese Dateien brauchst mußt Du sie halt einbinden.
> Legt man die 'include'-Dateien in z.b. ein
> "classes"-Unterverzeichnis?
Kannste hinlegen wo Du willst. Hauptsache es ist für PHP erreichbar.
> Oder in ein "include"-Verzeichnis?
Sinnvoll wäre sicherlich (bei vielen Klassen, wenn man das wie ne
Library in ein Hauptverzeichnis packt und je nach notwendigkeit im
include_path bekannt macht. So wie mans z.B. für PEAR handled
> Ich suche so nach Art "best practices für PHP5-OOP"...
Deine Fragen haben aber nichts mit OOP zu tun! Und ob PHP5 oder PHP4
genutzt wird spielt bei Deinen Fragen auch keine rolle.
Aber "Best practices" werden meist in Büchern beschrieben. Guckst Du:
http://www.professionelle-softwareentwicklung-mit-php5.de
MfG, Ulf
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 10:48:08 von GreenRover
Karsten Wutzke schrieb:
> "classes"-Unterverzeichnis? Oder in ein "include"-Verzeichnis?
Ähmm das ist doch Ansichtsache...
Ich z.B. der viel auf mod_rewrite baut, hat für das frontend so gut wie
imemr folgende struktur.
eine
/index.php
/includes/*.php //für die einzelnden Seiteninhalte, die je nach bedarf
includet werden, da Code Überhang in PHP recht auf die Performance geht
/core/*.php //hier finden sich meist die Bibliotheken. Wobei es 1-3
Datein sind, welche in der index.php includet werden, da sie
grundsätzliche Funktionen enthalten, die fast überall benötigt werden.
und dann noch sowas wie:
/core/smarty/ für das Template System
/core/db/ für die DB klasse.
naja und den rest über die includeten Datein geholt.
Also einfach möglichst konfortabel aber trotzdem, möglichst wenig
codeüberhang produzieren.
Aber wie gesagt, das ist Ansichstsache und jeh nach Anwendungszweck auch
noch unterschiedlich. (ich z.B. verwende im front und backend noch
unterschiedliche Systeme)
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 12:57:37 von Karsten Wutzke
Michael Jostmeyer schrieb:
> Hi Karsten,
> Karsten Wutzke schrieb:
> > 1. Wie sollten in PHP die Klassen/Dateien gehandelt werden? Eine Klasse
> > pro PHP-Datei wie in Java?
> Würde für den Entwickler Sinn machen. Außerdem nenne ich die Datei =
immer
> genau Klassenname.php, dann kann ich die per __autoload ganz einfach
> nachladen und brauche nie ein require_once, außer in der __autoload.
>
Nie? Coole Sache das. s.u.
> > 2. Sollte man die Funktions-Namenskonventionen (Methoden) mit
> > underscore (function get_age_group() etc.) aufrecht erhalten oder eher
> > zum Java-Style übergehen (function getAgeGroup() etc.)? Würde ja Si=
nn
> > machen, da z.B. für die MySQL-OOP-Schnittstelle auch dieselben
> > Funktionsnamen existieren...
> Interessante Frage. Letztendlich macht es ja keinen Unterschied, aber
> ich nutze aus Gewohnheit immer die Version ohne Unterstriche (Semikolons
> und geschweifte Klammern sind genug Sonderzeichen ;) )
>
Ja ich will halt konsistent bleiben. Weiß nich, wer was wie sieht,
wenn zumindest alle PHP-OOPler eher "camel notation" bevorzugen würd
ich auch eher den Weg gehn. Andererseits weiß man so, dass es eben
PHP-Code iss. -> underscores in functions
> > 3. Wie werden die OOP-Dateien am besten organisiert, sprich, wie sähe
> > der Verzeichnisbaum aus, auch im Hinblick auf die require-Anweisungen?
> > In Java gibt es ja packages, dort kann ich ja in einem z.b.
> > src-Unterverzeichnis alle Dateien in einem Verzeichnisbaum lagern und
> > mit den imports auch für tiefer in der Datei- bzw. Packagehierarchie
> > gelegene Klassen/Dateien imports aus übergeordneten Paketen holen.
> Leider gibt es in PHP keine Namespaces, hat es mal ganz kurz gegeben,
> wurden dann aber wieder entfernt...
> Daher ist es Sache des Entwicklers, seine Klassen in einem vernünftigen
> Verzeichnisbaum zu hinterlegen. Ein "classes"-Verzeichnis ist hier auf
> alle Fälle ein Minimum. Wie gesagt, ein require taucht bei mir in keiner
> Klassendatei auf, das übernimmt die __autoload, welche im Hauptskript
> implementiert ist.
>
Aha, würd mich ja echt mal interessieren, wie der Code dazu aussieht.
Hast Du mal ein kurzes Beispiel? Ich hab nämlich nich so viel Böcke
jede Klasse, die ich brauche einzeln in den includes/requires
anzugeben. Das wäre ne schöne Lösung um sowas wie in Java import
com.domain.packagex.* zu implementieren.
> Gruss Josi
Karsten
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 13:11:16 von Karsten Wutzke
Ulf Kadner schrieb:
> Karsten Wutzke schrieb:
>
snip
> > Ich suche so nach Art "best practices für PHP5-OOP"...
>
> Deine Fragen haben aber nichts mit OOP zu tun!
Doch, es geht z.B. um Namespaces und Datei- bzw.
Verzeichnishierarchien, was aufgrund des OO-Paradigmas entsteht.
OO-Fragen auf jeden Fall, OOP nicht direkt, aber peripher.
> Und ob PHP5 oder PHP4
> genutzt wird spielt bei Deinen Fragen auch keine rolle.
>
Geb ich Dir Recht, warum das hier wichtig zu Erwähnen ist bleibt Dein
Geheimnis...
> Aber "Best practices" werden meist in Büchern beschrieben. Guckst Du:
> http://www.professionelle-softwareentwicklung-mit-php5.de
>=20
Ach der... ;-)
> MfG, Ulf
Gruß
Karsten
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 13:25:23 von Ulf Kadner
Karsten Wutzke schrieb:
> snip
nana! ;-)
> Doch, es geht z.B. um Namespaces
Das leidige Thema von Namespaces. Alle wollens keiner implementierts in
PHP. War mal für PHP6 geplant aber wurde wieder verworfen. (Warum auch
immer)
> und Datei- bzw.
> Verzeichnishierarchien, was aufgrund des OO-Paradigmas entsteht.
Naja einen direkten Zusammenhang gibts da aber nicht. Das wird in PHP
alles etwas lockerer gesehen als in Java z.B.
__autoload wurde Dir als "Besonderheit" ja bereits genannt. (Steht im
Manual kannste selbst nachschlagen)
>> Und ob PHP5 oder PHP4
>> genutzt wird spielt bei Deinen Fragen auch keine rolle.
>
> Geb ich Dir Recht, warum das hier wichtig zu Erwähnen ist bleibt Dein
> Geheimnis...
Weil Du Dich ausschließlich auf PHP5 beziehst.
>> Aber "Best practices" werden meist in Büchern beschrieben. Guckst Du:
>> http://www.professionelle-softwareentwicklung-mit-php5.de
>
> Ach der... ;-)
Wie meinen? :-)
MfG, Ulf
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 13:49:04 von Michael Jostmeyer
Karsten Wutzke schrieb:
> Nie? Coole Sache das. s.u.
Jo, dat isset... *g*
> Ja ich will halt konsistent bleiben. Weiß nich, wer was wie sieht,
> wenn zumindest alle PHP-OOPler eher "camel notation" bevorzugen würd
> ich auch eher den Weg gehn. Andererseits weiß man so, dass es eben
> PHP-Code iss. -> underscores in functions
Um festzustellen, ob es sich um PHP-Code handelt, muss ich nur an den
Anfang des Skriptes gehen und nach Ausschau halten ;) Oder auf die
Dateiendung gucken.
> Aha, würd mich ja echt mal interessieren, wie der Code dazu aussieht.
> Hast Du mal ein kurzes Beispiel? Ich hab nämlich nich so viel Böcke
> jede Klasse, die ich brauche einzeln in den includes/requires
> anzugeben. Das wäre ne schöne Lösung um sowas wie in Java import
> com.domain.packagex.* zu implementieren.
Wie gesagt, Packages und Namespaces kennt PHP momentan leider nicht.
Hoffe ja wirklich, dass da sowas wieder kommt.
Eine __autoload könnte zB so aussehen:
function __autoload($class){
if(file_exists('classes/' . $class . '.php'){
require_once 'classes/' . $class . '.php';
return;
}
if(file_exists('core/classes/' . $class . '.php'){
require_once 'core/classes/' . $class . '.php';
return;
}
........
}
Ich prüfe meistens vorher noch ab, ob die Datei existiert, habe dann
noch weitere Mechanismen, um das richtige Verzeichnis zu wählen.
Aber das ist halt Sache vom Projekt.
Gruss Josi
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 13:59:00 von thorny
Ulf Kadner schrieb:
> Aber "Best practices" werden meist in Büchern beschrieben. Guckst Du:
> http://www.professionelle-softwareentwicklung-mit-php5.de
Also ein Buch als "Best practices" Beispiel zu empfehlen, obwohl die
Autoren noch nicht einmal etwas von Nomenklatur gehört haben, ist böse
[tm] ;)
Das Buch ist eine nette Grundlage, die jeder verinnerlichen sollte, aber
ein gutes Beispiel ist es noch nicht.
Gruß,
Torsten
Re: Organisation von OOP mit PHP5 (Java?)
am 19.10.2006 14:45:20 von Karsten Wutzke
Michael Jostmeyer schrieb:
> Karsten Wutzke schrieb:
> > Nie? Coole Sache das. s.u.
> Jo, dat isset... *g*
>
> Wie gesagt, Packages und Namespaces kennt PHP momentan leider nicht.
> Hoffe ja wirklich, dass da sowas wieder kommt.
>
> Eine __autoload könnte zB so aussehen:
> function __autoload($class){
> if(file_exists('classes/' . $class . '.php'){
> require_once 'classes/' . $class . '.php';
> return;
> }
> if(file_exists('core/classes/' . $class . '.php'){
> require_once 'core/classes/' . $class . '.php';
> return;
> }
> ........
> }
>
> Ich prüfe meistens vorher noch ab, ob die Datei existiert, habe dann
> noch weitere Mechanismen, um das richtige Verzeichnis zu wählen.
> Aber das ist halt Sache vom Projekt.
> Gruss Josi
Echt coole Sache... Danke!
Also jetzt nochmal zum Abraffen: in ./core/ lagert man Klassen, die man
zB für mehrere Projekte verwenden kann, also alle möglichen
Hilfsklassen, zB zum DB accessen, SQL statements generieren, HTML
strings generieren etc. pp? Und in ./classes bzw. ./include?
Ich steh mit meinen PHP-Künsten noch am Anfang, ein eigenes Projekt
hab ich noch nicht so wirklich, ich will ein Servlet nach PHP
portieren, die MySQL DB existiert unverändert of course. Es geht um
eine Basketball-Statistik-Datenbank. Die Objektklassen, also sowas wie
Game.php, Club.php, Standings.php, Team.php, Player.php usw., also
alles projektspezifische geht dann am besten nach ./classes bzw.
../include oder was?
Ich weiß ich bin da etwas penibel, aber ich brauch halt ne 1A klaro
Verzeichnisstruktur... in Java iss das ja vorgegeben.
Hat jemand Vorschläge?
../ -> display.php, search.php usw.
../classes -> alle spezifischen Klassen (Team.php, Game.php, ...)
../core -> alle Core-Klassen (Tools, Helfer, etc.)
Oder besser ./core/classes weils ja nur Klassen geben soll...? Ich find
das irgendwie kompliziert und unklar.
Achja, bekommt man reines OOP hin, also nur die Verwendung von Klassen?
Wenn ich schon alles umschreib. mysqli hat ja ein OO Interface, gilt
aber bestimmt nicht für alle Funktionen oder? s.o. mit file_exists...
Karsten