ubuntuusers.de

PHP Klassen Organisation

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Ruudsy

Anmeldungsdatum:
1. Mai 2012

Beiträge: 328

Hallo zusammen,

ich programmier schon seit geraumer Zeit mit PHP in Kombination mit MySQL, bisher aber nur eher kleinere Projekte.

Bis jetzt habe ich konsequent für jede Klasse iene Datei angelegt und diese schön in einem Ordner abgelegt. Geladen werden die Klassen über eine registierte Autoload-Funktion.

Das ganze ist ja schön und gut für nicht zu große Projekte. Ich habe mir etwas vorgenommen, was aber meine bisherige Anzahl an Klasen und damit auch Dateien übersteigen wird und auch die Übersicht wird darunter leiden.

Meine Frage in diesem Zusammenhang wäre, ob ihr einen Tipp parat hättet, wie man eine größere Anzahl an Klassen in einem Ornder und Unterordnern organisieren kann, diese aber Trotzdem noch unkomplizerit mit einem Autoloader geladen werden können.

Danke schon mal 😉

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Das einfachste wäre es, auf PHP zu verzichten und eine sinnvollere Sprache zu benutzen 😈 (SCNR)

Ansonsten gibt es doch sicherlich in der PHP-Dokumentation einen Coding-Guide, der Best-practises oder Konventionen vorstellt? Da würde ich als erstes mal gucken / suchen. Pro Datei eine Klasse riecht nach Java... da ist es dank IDEs aber letztlich egal, wie man das angeht - wer "denkt" dabei überhaupt auf Dateiebene?

Ich würde Dir generell aber eh zu einem Web-Rahmenwerk raten; Cake, Symfony oder zend fallen mir da namentlich direkt ein. Bei einem solchen Framework bist Du idR. eh stark an Vorgaben bebunden; da werden Dir organisatorische Fehler weniger schnell unterlaufen - von allen anderen Vorteilen ganz zu schweigen.

Ruudsy

(Themenstarter)

Anmeldungsdatum:
1. Mai 2012

Beiträge: 328

Lysander schrieb:

Das einfachste wäre es, auf PHP zu verzichten und eine sinnvollere Sprache zu benutzen 😈 (SCNR)

Dann stell mir doch mal eine sinnvollere Spreche vor, für ein Shared-Hosting webspace 😉 für anregungen bin ich immer offen ... Lysander schrieb:

Ansonsten gibt es doch sicherlich in der PHP-Dokumentation einen Coding-Guide, der Best-practises oder Konventionen vorstellt? Da würde ich als erstes mal gucken / suchen. Pro Datei eine Klasse riecht nach Java... da ist es dank IDEs aber letztlich egal, wie man das angeht - wer "denkt" dabei überhaupt auf Dateiebene?

Das ist witzig, da ich in meiner Frühzeit als Hobby-Programmier mit Java am wenigsten gedult hatte, viel weniger als mit pearl, php c++ und python. Aber mir erschein es sehr sinnvoll für jede Klasse, die später gebraucht wird eine Datei zu haben. das in dieser Datei auch ein paar abstract Klassen zu finden sind, verschweige ich jetzt mal dezent! Ich habe ein paar Möglichkeiten gefunden, die mich aber allesamt nicht sehr zufriedenstellen, leider. Auf diese kann ich shcon zurückgreifen, aber ich wollte vorher unterumständen noch weitere Ideen kennenlernen um mir ein eigenes Bild zu machen. Lysander schrieb:

Ich würde Dir generell aber eh zu einem Web-Rahmenwerk raten; Cake, Symfony oder zend fallen mir da namentlich direkt ein. Bei einem solchen Framework bist Du idR. eh stark an Vorgaben bebunden; da werden Dir organisatorische Fehler weniger schnell unterlaufen - von allen anderen Vorteilen ganz zu schweigen.

hmm, ... als organisatorischen Fehler würde ich es nicht einordnen wollen, es geht nur um ein wenig mehr Überblick.

Das ist so eine Sache mit mir und diesen FW, ... ich habe mich schon versucht in zwei einzuarbeiten, vor langer Zeit war es einmal Zend und vor wenigen Monaten CakePHP. Ich habe für mich entschieden, dass das was ih möchte damit sicherlich zu realisieren ist, aber ein gutes Stück an Einarbeitung nach sich zieht. MVC habe ich umgesetzt, damit bin ich gut zurecht gekommen, darüberhinaus habe ich schon eine eigene Klassensammlung, die mir ganz gut gefällt, die ich aber (der Arbeit wegen) nicht zu einem FW portieren möchte.

Wenn jemand noch Ideen hat, dann immer her damit 😉

froggydancer

Anmeldungsdatum:
6. Januar 2010

Beiträge: 156

Ruudsy schrieb:

Das ist so eine Sache mit mir und diesen FW, ... ich habe mich schon versucht in zwei einzuarbeiten, vor langer Zeit war es einmal Zend und vor wenigen Monaten CakePHP.

Dann wäre doch jetzt nochmal die Gelegenheit sich Symfony mal anzuschauen, was wie ich finde professioneller aufgezogen ist als CakePHP.

Ich habe für mich entschieden, dass das was ih möchte damit sicherlich zu realisieren ist, aber ein gutes Stück an Einarbeitung nach sich zieht.

Bei kleineren Projekten ist der Einarbeitungsaufwand in der Tat überproportional groß, bei größeren Projekten jedoch ist eine ordentliche Struktur sehr wichtig und gerade dort nimmt ein gutes Framework einem ein großes Stück Arbeit ab. Daher solltest du nochmal über den Einsatz eines Frameworks nachdenken.

Wenn jemand noch Ideen hat, dann immer her damit 😉

Zurück zur Ursprungsfrage: Wie kann man die PHP-Klassen am besten organisieren?

Den wichtigsten Schritt hast du ja schon getan, nämlich den Autoloader zu verwenden. Ich würde nun den eigenen Autoloader erweitern und sehe dafür verschiedene Herangehensweisen:

Die verschiedenen Klassen(dateien) solltest du - wie selbst schon angedacht - in Ordner zusammenfassen. Nach welcher Logik und wie verschachtelt, bleibt deinem Geschmack überlassen 😉

Jetzt muss der Autoloader nur noch wissen, wo er die Klassen findet. Das könntest du z.B. dadurch erreichen, dass du den Pfad im Klassennamen codierst, Bsp: Klasse Database_Mysql_Connection findet sich in Database/Mysql/Connection.php

Ein anderer Ansatz wäre eine Art Index zu verwalten, z.B. in einem Array:

1
2
3
4
5
6
7
class myAutoloader {
    protected $paths = array(
        'Mysql_Conection' => 'Database/Mysql/Connection.php',
        ...
    );
    ...
}

Damit hast du dann natürlich einen zusätzlichen Verwaltungsaufwand für den Index.

Weiterer Ansatz wäre eine Mischform, nämlich den Autoloader (einmalig) alle Ordner (rekursiv) durchsuchen zu lassen und damit selbst den Index generieren zu lassen. Du benötigst dann natürlich ein zuverlässiges Mapping von Klassenname zu Dateiname für die Indexgenerierung, kannst aber auch gezielte Ausnahmen hinzufügen.

Beste Grüße
Froggy

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Wenn ich kein Framework benutze, läuft es einfach daraus hinaus, dass ich selber eines entwickele! Natürlich mit weniger Features, einer idR. eher unschöneren API und dazu vermutlich noch mit vielen Fallstricken und Sicherheitslücken. Klingt hart, ist aber so ☺ Die Zeit kann man sich einfach sparen, indem man sich in ein Framework einarbeitet. Man muss auch nicht alle seine Features nutzen und aus dem FF beherrschen, um damit produktiv zu arbeiten. Insofern würde ich auch das Zeit Argument nicht gelten lassen 😉

Wenn ich ein Programm mit GUI entwickeln will, dann nutze ich doch ein UI-Toolkit - niemand käme dabei auf die Idee, das anders anzugehen. Komisch, dass das im Webumfeld oftmals immer noch anders ist...

Ruudsy

(Themenstarter)

Anmeldungsdatum:
1. Mai 2012

Beiträge: 328

Hallo nochmal,

also im Moment sieht es so aus, dass ich es über eine Art Index laufen lasse, den in manuell verwalte, es macht mir das insgesamt schon einfacher.

Die Diskussion mit dem FW ist ja auch eine Krux:

Mir ist klar, dass sich da viele schlaue Leute Gedanken gemacht haben und dass diese auch nicht mehr so Fehler behaftet sind, als wenn man etwas selbst aufsetzt. Der Rat ist auch angekommen.

Die Einarbeitungszeit ist nicht das alleineige Thema, das Problem ist hauptsächlich, dass ich mich schon in ein CMS eingearbeitet habe, um am Ende festzustellen, dass ich miene Idee damit nicht realisieren kann. Ich möchte mich sicher nicht in weitere FW einarbeiten um festzustellen, dass es nicht funktioniert. Ich sollte erst klären, welches Framework meinen Vorstellungen gerecht werden kann um mich dann darin einzulesen. Aber einen Diskussion zu führen ohne in ein FW eingelesen zu sein wird wiederum schwierig.

Ich habe auch schon ein paar mal als antwort bekommen, ich möchte doch für ein FW eine erweiterung schreiben, das erfodert ja wiederum einblicke in die Programmierparadigmen des jeweiligen FW.

Alles nicht so einfach.

Ich schließe das gerne mal damit, ich eröffne jetzt mal ein neuen Thread, der meine Vorstellungen darlegt und vielleicht findet sich ein FW.

http://forum.ubuntuusers.de/topic/php-framework-dynamisch-ein-formular-erstellen/

Lysander schrieb:

Wenn ich ein Programm mit GUI entwickeln will, dann nutze ich doch ein UI-Toolkit - niemand käme dabei auf die Idee, das anders anzugehen. Komisch, dass das im Webumfeld oftmals immer noch anders ist...

zum Glück will ich keine GUI entwickeln 😉

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

froggydancer schrieb:

Jetzt muss der Autoloader nur noch wissen, wo er die Klassen findet. Das könntest du z.B. dadurch erreichen, dass du den Pfad im Klassennamen codierst, Bsp: Klasse Database_Mysql_Connection findet sich in D#atabase/Mysql/Connection.php

Warum dann nicht gleich soweit gehen, Unterverzeichnisse als separate Namespaces aufzufassen? Der Autoloader selbst braucht dann nur noch den Namespace in seine einzelnen Segmente zerlegen und darauf aufbauend den Pfad ermitteln.

Grüße

froggydancer

Anmeldungsdatum:
6. Januar 2010

Beiträge: 156

xabbuh schrieb:

froggydancer schrieb:

Jetzt muss der Autoloader nur noch wissen, wo er die Klassen findet. Das könntest du z.B. dadurch erreichen, dass du den Pfad im Klassennamen codierst, Bsp: Klasse Database_Mysql_Connection findet sich in D#atabase/Mysql/Connection.php

Warum dann nicht gleich soweit gehen, Unterverzeichnisse als separate Namespaces aufzufassen? Der Autoloader selbst braucht dann nur noch den Namespace in seine einzelnen Segmente zerlegen und darauf aufbauend den Pfad ermitteln.

Namespaces gibt es erst seit PHP 5.3. Das gibt es nun auch schon eine Weile und wenn die entsprechende Laufzeitumgebung das unterstützt, sind Namespaces tatsächlich eine super Möglichkeit die Klassen schön abgeschlossen zu kapseln, daran hatte ich noch gar nicht gedacht.

Antworten |