php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.12.2011, 14:39  
archer42
Gast
 
Beiträge: n/a
Standard Kritik zu Autoloader

Hallo,
ich arbeite gerade am Autoloader und benötige noch etwas Kritik um diesen zu verbessern:

Verzeichnisstruktur:
root = /home/user/Projekte/One
Kernengine = /home/user/Projekte/One/core
Erweiterungen = /home/user/Projekte/module

Als Namespace benutze ich den Projektnamen (z.B. One) und dann das Subverzeichnis

Autoloader
PHP-Code:
<?php namespace Onecore;

final class 
autoLoader {
    private static 
$fileExtension '.php';
    private static 
$directorySeparator '/';
    
    
// Singleton Klasse
    
private static $instance NULL;

    private function 
__construct() {}
    private function 
__clone() {}

    public static function 
getInstance() {
        if (
NULL === self::$instance) {
            
self::$instance = new self;
        }
            return 
self::$instance;
    }
    

    public static function 
register() {
        
spl_autoload_register(array($this'loadClass'));
    }
    public static function 
unregister() {
        
spl_autoload_unregister(array($this'loadClass'));
    }
   
    public static function 
loadClass($className) {
        
// Prüft ob Zuständig durch Namespace
        
if(strpos($className__NAMESPACE__) !== 0) {
            
// Falls nicht zuständig Übergabe an Autoloader des module-Verzeichnises
            
if(!OnemoduleautoLoader::register()) {
                return 
FALSE// Falls dieser nichts findet Abbruch
            
}
        }
        
        
$classDir substr(__NAMESPACE__4);
        
// Entfernung des Projektnamen (One) + Namespace Seperator
// Ziemlich unelegant, sollte ich für die Entfernung des Projektnamens reguläre Ausdrücke benutzen oder gibt es eine fertige *str-Funktion von PHP?
        
        
$path $classDir.$directorySeparator.$className.$this->fileExtension;
        if(
file_exists($path)) {
            include 
$path;
        } else {
            return 
FALSE;
        }
    }
}

?>
Her mit der Kritik
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 21.12.2011, 15:24  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Warum was eigenes? Einen Standard für das Mapping Verzeichnis <-> Namespace gibt es ja schon: https://github.com/php-fig/fig-stand...epted/PSR-0.md

Eine Referenz-Implementierung für den entsprechenden Autoloader auch: https://gist.github.com/221634. Oder eben die Implementierung von Symfony, die auch noch PEAR versteht: http://symfony.com/doc/2.0/cookbook/...utoloader.html
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 21.12.2011, 15:41  
archer42
Gast
 
Beiträge: n/a
Standard

Zitat:
Warum was eigenes?
Als Beweis das man es versteht

Wird es Kritik geben oder soll ich einen "fertigen" Autoloder benutzen?
  Mit Zitat antworten
Alt 21.12.2011, 15:48  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Du könntest die verlinkten Autoloader als "Inspiration" nutzen und schauen was die anders machen. Ich persönlich nutze keine Autoloader.
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 21.12.2011, 15:56  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Etwas zu instanziieren was keine Instanz-Eigenschaften oder -Methoden hat die aufrufbar oder erreichbar sein könnten macht keinen sinn.

in statischen Funktionen die auch statisch aufgerufen werden mit $this zu arbeiten wird auch etwas kritisch.

Ich würde dir nahelegen für dein "Projekt" eine Autoloader-Klasse zu erzeugen, die bei der Instanziierung namespace-informationen annimmt und auch ( alternativ ! ) file-extension informationen.

PHP-Code:
require_once 'autoload.class.php';

autoLoad::register(array('foo','bar'), 'path/to''.inc');
autoLoad::register(array('baz','bin','bol'), 'path2/to''.inc');

$o = new foobarworld(); // success, registred, founded
$o = new bingbongbang(); // failed, not registred 
Alternativ Elternklasse die die Funktionalität liefert und Kindklassen die entsprechend konfigurieren, sodas du lediglich

PHP-Code:
require_once 'autoload.class.php';

new 
moduleAutoloader;
new 
coreAutoloader;
new 
snoopyAutoloader
brauchst.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 21.12.2011, 16:11  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

FYI: http://www.phpforum.de/forum/showthread.php?t=267201
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 21.12.2011, 16:42  
archer42
Gast
 
Beiträge: n/a
Standard

Zitat:
in statischen Funktionen die auch statisch aufgerufen werden mit $this zu arbeiten wird auch etwas kritisch.
Mein Fehler, war noch ein Überbleibsel der vorherigen nicht-Singleton Version.

PHP-Code:
require_once 'autoload.class.php';

autoLoad::register(array('foo','bar'), 'path/to''.inc');
autoLoad::register(array('baz','bin','bol'), 'path2/to''.inc');

$o = new foobarworld(); // success, registred, founded
$o = new bingbongbang(); // failed, not registred 
Das verstehe ich noch nicht ganz. Ist es nicht der Sinn eines Autoloaders keine include Liste erstellen zu müssen?
Ich dachte der Autoloader findet die Dateien von alleine?

Zitat:
Alternativ Elternklasse die die Funktionalität liefert und Kindklassen die entsprechend konfigurieren, sodas du lediglich
Das ist eine gute Idee! Werde das umsetzen

Ende gelesen?->Ende interpretiert?->Verständnis für diesen Thread bekommen?->Selbstbeantwortung der Frage
  Mit Zitat antworten
Alt 21.12.2011, 18:00  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Mir gefällt jetzt weder das Klassendesign noch sehe ich einen echten Vorteil. Wo genau ist der Mehrwert?

Ich kann keine eigenen Autoloader registrieren, keine verschiedenen Endungen und soweit ich das sehe funktioniert er auch gar nicht, da dein file_exists() ja auf einen Subpfad prüft, der zwar per include funktioniert, da der include_path mitverwendet wird, aber file_exists() kann damit eigentlich nicht umgehen.

Insofern eher Daumen nach unten.
__________________
"Nuschel ich?" - "Was?"
Chriz ist gerade online   Mit Zitat antworten
Alt 21.12.2011, 18:13  
archer42
Gast
 
Beiträge: n/a
Standard

Zitat:
Mir gefällt jetzt weder das Klassendesign noch sehe ich einen echten Vorteil. Wo genau ist der Mehrwert?
Zu einem fertigen Autoloader?

Zitat:
Ich kann keine eigenen Autoloader registrieren, keine verschiedenen Endungen und soweit ich das sehe funktioniert er auch gar nicht, da dein file_exists() ja auf einen Subpfad prüft, der zwar per include funktioniert, da der include_path mitverwendet wird, aber file_exists() kann damit eigentlich nicht umgehen
Danke damit weiß ich was noch nachzubessern ist

Geändert von archer42 (21.12.2011 um 18:19 Uhr).
  Mit Zitat antworten
Alt 21.12.2011, 18:27  
archer42
Gast
 
Beiträge: n/a
Standard

So habe nochmal nachgedacht.

Ihr hattet recht, es ist sinnlos alles neu zu erfinden ^^, aber manchmal muss man selbst zu der Erkenntnis kommen und ist stur und hört nicht

Sind neben jwage's autoloader noch weitere Empfehlungen auszusprechen?
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] *Update* Zend Autoloader BasePath per Application.ini mitgeben dreamcatcher PHP Einsteiger 6 15.06.2011 18:00
Kritik an PHP.de² dreamcatcher Off-Topic Diskussionen 3 18.04.2011 08:07
Erstes Projekt fertig - Kritik bitte mentalman Off-Topic Diskussionen 40 18.03.2011 07:01
[Erledigt] Zend_Framework: Autoloader lädt Klasse nicht wie erwartet christophk PHP Tipps 2009 5 16.01.2010 08:10
Kritik an PHP hahahanni Off-Topic Diskussionen 18 03.12.2009 14:18
Kritik - OOP Event-Calendar (Konzept+Code) manuakasam Software-Design 9 02.12.2009 08:23
[Erledigt] Autoloader und einbinden von PEAR-Klasse Daniel86 PHP-Fortgeschrittene 2 02.09.2009 15:12
[Erledigt] [ZF 1.8.0] Der neue Autoloader, Modifizierungen? #EFEFEF PHP-Fortgeschrittene 11 27.06.2009 01:10

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php namespace autoload, registrierten autoloader nutzen php

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:47 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum