| | | | |
| |||||||
| Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Auf Dateisystemfunktionen würde ich tunlichst verzichten! Autoloader sollten IMHO möglichst performant sein. Das ist bei Dateizugriffen nicht gegeben. Für kleine Projekte (für große gälte sicher die gleiche Argumentation bzgl. Speicherbelegung), benutze ich einfach eine statische Registry. PHP-Code: Ich kann Klassendefinitionen überschreiben, indem ich einfach später eine erneute Zuweisung mit dem selben Schlüssel benutze.
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | |
| da schreibt der ElePHPant Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Es gibt zwei Gründe dir mir spontan einfallen: 1. Die Performance. Jedes mal das komplette Dateisystem zu scannen würde wohl relativ lange dauern. Gerade wenn du mehrere Dateien einbinden musst und jedes mal das komplette System gescannt wird, dann sprengt das wohl irgendwann den Rahmen. 2. Namenskonflikte: Wie schnell passiert es dass du dann zwei Klassen hast die den selben Namen haben? Du darfst auf keinen Fall zwei gleiche Dateien haben. Zend/Db/Adapter/Abstract.php oder Zend/Form/Decorator/Abstract.php beide würden bei deinem autoloader auf die selbe Klasse "zeigen". Ich find eigentlich die Namenkonventionen des Zend Frameworks sehr angenehm. Grade weil man weiß das _ einen Ordner bezeichnet und die Großbuchstaben dann beliebig im Klassennamen verwendet werden können wie eben MySQL oder HtmlTag. Ansonsten kannst du dich ja mal mit den Namespaces in PHP 5.3.0 auseinander setzen. Vlt. kannst du dir damit was schönes basteln. Ich muss ehrlich sagen ich hab damit noch nicht gearbeitet und dementsprechend kenn ich auch keine "Musterlösungen". Müsste man mal sehen was man damit anstellen könnte. Falls du ne Lösung findest kannst du dich ja nochmal melden ![]() |
| | |
| | |
| Benutzer Registriert seit: 20.11.2009
Beiträge: 91
PHP-Kenntnisse: Fortgeschritten ![]() | Also ersteinmal vielen Dank für die Schnellen Antworten. @Florian: - Der Punkt mit der Performance ist gut. Jedesmal das Dateisystem nach nur einer Klasse abzusuchen ist auf Dauer ein langer Prozess, sobald das Dateisystem eine entsprechende Größe hat. - Die Namenskonflikte würden in meinem Lösungsansatz ja eigentlich wegfallen, da ich nach der Datei anhand des Klassennamens suchen würde. Also wird es nicht dazu kommen, das ich zwei oder mehrere Dateien in meinem System habe, die beispielsweise Abstract.php heißen. Bezüglich der Namespaces.. Ich habe heute ehrlich gesagt, den ganzen Tag damit verbracht eine saubere Lösung mit Namespaces zu konzipieren, nur scheiterte jeder Versuch. Da auch dort die Klassenbezeichnungen nicht mehr nur die einzelnen Namen der Klassen sind, sondern die dazu gehörigen Namespaces vor den Klassenbezeichner geschrieben werden. Womit eine instanziierung einer Klasse auch nicht schön aussehen würde. Aber vielen Danke das Argument mit der Performance überzeugt mich schon an ganzes Stück .@nikosch: - Also deine Lösung mit der Registry-class finde ich sehr gut. Sie bringt wirklich eine Menge Vorteile mit sich. Nur habe ich wohl vergessen zu erwähnen, das ich vor habe die nutzung von require_once oder include möglichst gering zu halten, wenn nicht sogar auf eine einmalige Verwendung zu reduzieren. Deswegen auch die Idee die __autoload() Funktion so zu Programmieren, das Sie mir alles an Klassen zurück geben kann, was ich grade so brauche. Aber da wir ja eben schon den Punkt Dateizugriff und Performance hatten, muss ich sagen, das mich das schon sehr Überzeugt hat, von dem Lösungsansatz wegzulenken. Nochmal vielen Dank für die Ratschläge Gruß Tidus |
| | |
| | |
| Benutzer Registriert seit: 04.04.2010
Beiträge: 83
PHP-Kenntnisse: Fortgeschritten ![]() | Du musst ja nicht bei jedem Scriptaufruf alle Verzeichniss scannen, sondern nur einmalig oder wenn neue Dateien hinzugekommen sind. Beim Scannen kannst du dir ein Array mit der Zuordnung Klassenname => Include-Datei erstellen und dieses dann serialisieren. Die Autoload-Funktion kann dieses Array dann wieder deserialisieren und hat so die Zuordnung. |
| | |
| | |
| Benutzer Registriert seit: 20.11.2009
Beiträge: 91
PHP-Kenntnisse: Fortgeschritten ![]() | Sorry dass ich hier noch mal anhänge... @nikosch: Ich hatte ebend eine statische Registry nur kurz überflogen. Wie sie letztendlich zu nutzen ist und was für Vorteile sie mit sich bringt ist ganz klar einleuchtend. Jetzt hätte ich allerdings noch eine Frage. Du registrierst ja mit der statischen Methode registerClass($name, $value) die Klasse die du als Parameter $value (bzw. hier ist es ja der Pfad zur Datei) übergibst. Aber das bedeutet ja, das jedesmal wenn du eine Klasse an einer bestimmten stelle brauchst, das du diese mit deiner registerClass() Methode erst einmal registrieren muss, damit du sie von da an anhand des Schlüssels als Klassenbezeichner instanziieren kannst. Das Bedeuted aber doch wiederum, das man dazu gezwungen ist, sämtliche Klassen, die grade gebraucht werden, händisch nachzuladen. In deinem Fall, dass man sie registriert. Es sei denn, man registriert an einer Zentralen Stelle mit deiner Methode alle Klassen, was aber ja auch nicht unbedingt sinnvoll ist, da nicht immer alle Klassen gebraucht werden. Ich hoffe ich habe die Funktionalität soweit richtig nachvoll ziehen können. Ich finde diese Lösung auch sehr gut. Nur der Punkt, das ich weiterhin händisch Klassen im Code nachladen muss, und dies nicht automatisch über die __autoload() Funktion passiert, ist mir weiterhin ein kleiner Dorn im Auge =/ Bei Missverständnissen meinerseits, bitte drauf aufmerksam machen. |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Es bedeutet, dass ich sämtlich Klassen, die ich benötige „bekannt machen“ muss (eben registrieren), nicht aber, dass ich alle entspr. Files einbinden (require) muss. Ich halte das so, dass ich modulweise eine Datei erstelle (meinetwegen global.php im obersten Modulpfad) und dort dann alle Registrierungen notiere. Den Overhead für nicht benötigte Klassen nehem ich dabei in Kauf - wie gesagt, für Projekte mit tausenden Klassen ist das wahrscheinlich nicht mehr sinnvoll. Mir ist auch bewusst, dass dieses Prinzip nicht die Freiheit des „Modul reinkopieren und verwenden“ bieten kann. Für den Core benutze ich übrigens ein zentrales File, das dann mehrere Core-Module umfasst.
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | |
| Benutzer Registriert seit: 20.11.2009
Beiträge: 91
PHP-Kenntnisse: Fortgeschritten ![]() | @hpf: Vielen dank für deine Antwort. Okay, das stimmt. Nur ab wann weiß mein System denn, das eine neue Klasse dazu gekommen ist, und ein neues Array mit den Pfaden erzeugt werden muss? Das bedeutet, ich müsste bei jeder neuen Klasse mit das Array erweitern. Diesen Ansatz habe ich bereits durchgekaut. Und halte ihn in der Hinsicht für ein wenig unflexibel, was die Automatisierung meines Problems angeht. Für den Fall das ich dich falsch verstanden habe, korrigiere mich bitte. Gruß Tidus |
| | |
| | |
| Moderator Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Betreffs einer kompletten Umsetzung mit Namespaces kannst du dir ja mal das hier anschauen: PSR-0 Final Proposal - PHP Standards Working Group | Google Groups implementierung in php 5.3: gist: 221634 - GitHub Das soll ein Standard werden auf den sich einige Frameworks und Projekte (Zend, Symfony, Drupal, Sonar, Lithium, Agavi, Cake, PEAR, Typo3/Flow3, phpBB ) einigen wollen um Code auch besser untereinander wiederverwendbar zu machen und bei der Nutzung von Code anderer Systeme nicht immer so einen Aufwand mit dem Autoloading zu haben. Eventuell gibt es das ganze dann auch als PECL-Modul oder integration in die SPL: -> SplClassLoader as a PECL extension - PHP Standards Working Group | Google Groups Wenn du eh mit php 5.3+ arbeitest ist es ja auch kein problem deine Klasse einfach "Admin" zu nenen in den Namespace User zu packen und dann oben ein use User\Admin; oder use User\Admin as UserAdmin; zu machen, damit bist du im Quellcode selbst absolut frei die klasse zu nennen wie du willst und das autoloading passiert transparent über den ursprünglichen namen. Der aktuelle Autoloader des Zend Frameworks kann auch schon mit namespaces und php 5.3 umgehen.
__________________ robo47.net - Blog, Codeschnipsel und mehr | |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Ergebnis von switch() in der Function verwenden ? | ALiP | PHP Tipps 2009 | 4 | 13.07.2009 17:04 |
| Objekte in Objekten verwenden | Cube | PHP Tipps 2009 | 6 | 30.06.2009 16:18 |
| [Erledigt] id als variabel verwenden. wie? | ld_forester | JavaScript, Ajax und mehr | 4 | 29.08.2008 02:55 |
| Variable aus Subselect in JOIN verwenden | GSJLink | Datenbanken | 5 | 25.05.2008 11:36 |
| Variablen in einer Funktion verwenden | Smily0412 | PHP Tipps 2006 | 3 | 24.09.2006 16:42 |
| nuSoap mit document/literal verwenden | vegeta | PHP Tipps 2006 | 2 | 29.06.2006 12:49 |
| <button> verwenden - wie unterscheiden??? | Tigermoon | PHP Tipps 2006 | 12 | 31.05.2006 11:44 |
| Post- und Get-Methode gleichzeitig verwenden | PHP Tipps 2007 | 50 | 07.12.2005 08:13 | |
| Instanz über mehrere Seiten verwenden? | becks123 | PHP Tipps 2005-2 | 3 | 22.08.2005 10:10 |
| Mehrere SESSION verwenden? | michi174 | PHP Tipps 2005-2 | 4 | 22.06.2005 17:40 |
| [Erledigt] $$var / ${$var} in preg_replace_callback() verwenden | PHP Tipps 2005 | 8 | 20.04.2005 18:02 | |
| Grafiken als Rahmen verwenden?! | CSS | HTML, Usability und Barrierefreiheit | 8 | 03.03.2005 20:49 |
| musst man ¨ in meta tags verwenden? | HTML, Usability und Barrierefreiheit | 16 | 24.02.2005 17:50 | |
| blob verwenden (xtreme noob) | Malfunction | Datenbanken | 9 | 03.02.2005 13:51 |
| php und java script zusammen verwenden??? | PHP Tipps 2005 | 6 | 14.01.2005 10:04 | |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| php __autoload, php autoload, __autoload, typo3 __autoload, php autoload mehrere ordner, php autoload performance, php autoload alle ordner durchsuchen, php gib alle deklarierten klassen aus, php autoload mehrere verzeichnisse, php autoload typo3, zend autoload überschreiben, php autoload windows, zend typo3 autoload, php __autoload function, neue autoloading php 5.3 namespaces, php autoload ordnerstruktur, php autoload abstract, __autoload(), wie zend in drupal einbinden, zend framework __autoload |