php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.01.2012, 23:45  
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 184
PHP-Kenntnisse:
Anfänger
GELight sorgt für eine eindrucksvolle AtmosphäreGELight sorgt für eine eindrucksvolle Atmosphäre
GELight eine Nachricht über ICQ schicken GELight eine Nachricht über MSN schicken
Standard [Erledigt] Autoloader für Klassen

Nabend,

Ich bin derzeit auf der Suche nach einer Verbesserung meines automatichen Klassenloader.
Also derzeit lade ich meine Klassen mit folgendem Script nach ( ich vermute Ihr kennt das Script ):

PHP-Code:
spl_autoload_register(nullfalse);

spl_autoload_extensions(".class.php");

/*** Class Loader ***/
class Autoloader {
    
    private static 
$basePath null;
    private static 
$BACKEND_CLASS_PATH "";
    
    public static function 
autoload($className) {
        
        echo 
$className;
        
        if (
self::$basePath === nullself::$basePath dirname (__FILE__);

        if (
strpos ($className'.') !== false || strpos ($className'/') !== false || strpos ($className'\\') !== false || strpos ($className':') !== false) {
            return 
false;
        }
        
        
$teile preg_split ('/(?<=.)(?=\p{Lu}\P{Lu})|(?<=\P{Lu})(?=\p{Lu})/U'$className);
        
$pfad self::$basePath.DIRECTORY_SEPARATOR.self::$BACKEND_CLASS_PATH.join (DIRECTORY_SEPARATOR$teile).'.class.php';
        if (!
file_exists ($pfad)) {
            return 
false;
        }
        
        include_once 
$pfad;
        
    }
    
    public static function 
setBackendClassPath ($pathArray) {
        
self::$BACKEND_CLASS_PATH join(DIRECTORY_SEPARATOR$pathArray).DIRECTORY_SEPARATOR;
    }
    
}

Autoloader::setBackendClassPath( array("backend","res","classes") );

spl_autoload_register (array ('Autoloader''autoload')); 
Der Autoloader nimmt den Namen der aufzurufenden Klasse so auseinander, dass er die Einzelteile als Verzeichnisse einsetzt und dort versucht eine Datei zu includieren.

$test = new MeineEigeneKlasse();
... hier includiert er z.B.:
backend/res/classes/Meine/Eigene/Klasse.php
Die eigentliche Klasse in Klasse.php muss allerdings auch "MeineEigeneKlasse" heißen und genau da komme ich jetzt in Schwierigkeiten.

Was ich allerdings gern hätte wäre die Möglichkeit, meine Klassen dynmisch nur dann nachzuladen, wenn ich sie brauche aber dennoch selbst entscheiden kann, in was für eine Ordnerstruktur ich sie unterhalb von backend/res/classes/ ablege. Ich denke der Ansatz sowas über den Klassennamen zu regeln ist doch nicht der Beste. Gerade, wenn man dann noch wie ich versucht eine fremde Library ( Smarty Template Engine ) mit einzubinden. Hier ist es ja nicht gerade angebracht einfach so eine fremde Klasse umzubenennen nur um sie in ein Verzeichnis meiner Wahl zu bekommen....

Gibts da evtl. Ansätze, wie sowas sauberer funktionieren sollte/könnte?

Gruß Mario
GELight ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 31.01.2012, 00:34  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Also ich mach ein Array Name => Pfad. Das da oben ist mir zu viel FooBar.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 31.01.2012, 04:34  
Neuer Benutzer
 
Registriert seit: 31.01.2012
Beiträge: 2
PHP-Kenntnisse:
Fortgeschritten
Crlf befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Also ich mach ein Array Name => Pfad. Das da oben ist mir zu viel FooBar.
Da muss ich dir vollkommen zustimmen, FooBar bringt es ziemlich auf den Punkt. Ein Array mit name => value reicht doch, oder nicht? Falls nicht, musst du dein Problem wohl näher erläutern.

Gruß

Crlf
Crlf ist offline   Mit Zitat antworten
Alt 31.01.2012, 08:02  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Mit Namespaces arbeiten?
Trainmaster ist gerade online   Mit Zitat antworten
Alt 31.01.2012, 08:42  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 1.141
PHP-Kenntnisse:
Anfänger
hausl wird schon bald berühmt werdenhausl wird schon bald berühmt werden
Standard

Ev. kannst damit hier was anfangen:
http://www.php.de/php-einsteiger/830...tml#post621031 ([Erledigt] Idealer Zeitpunkt/Ort für Include bzw. Instantierung?)

Lg
__________________
Keine Zahl != ein Zeichen das keine Zahl ist
hausl ist offline   Mit Zitat antworten
Alt 31.01.2012, 14:06  
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 184
PHP-Kenntnisse:
Anfänger
GELight sorgt für eine eindrucksvolle AtmosphäreGELight sorgt für eine eindrucksvolle Atmosphäre
GELight eine Nachricht über ICQ schicken GELight eine Nachricht über MSN schicken
Standard Autoloader

Okay... ich beschreib noch mal, was ich gern "hätte"

Ich hätte gern
... die Möglichkeit, meine Klassen beliebig in Verzeichnisse zu packen aber dennoch per Autoloader "irgendwie" die Klassen automatisch finden und einbinden.


@nikosch / @Crlf:
Was meint Ihr mit Array Name => Pfad? Bzw. was sind deine Gedanken dahinter?
Denkst du an eine Art Registry für die zu verwendeten Klassen im Autoloader?
PHP-Code:
array(
    
"className1" => "ordner/ordner/className1.php",
    
"classNameNr2" => "ordner/classNameNr2.php",
    
"classNameNummer3" => "classNameNummer1.php",
); 
Wenn ja, wie würdet Ihr das angehen oder was würdet Ihr an meinem Autoloader alles ändern?

@Trainmaster:
Ich hab im Zusammenhang mit PHP ehrlich gesagt noch nie mit NAMESPACES gearbeitet. Könntest du deinen Gedanken etwa genauer beschreiben? Ich brauch immer meine praktischen kleinen Beispiele. Kann mir mit der reinen Idee Namespaces zu verwenden noch kein rechtes Bild einer Idee aufbauen.

@hausl:
Deinen Link schau ich mir noch mal in Ruhe an. Vielleicht ist was dabei, was ich verwenden kann.

So ich hoffe ich nix vergessen.

Gruß Mario
GELight ist offline   Mit Zitat antworten
Alt 31.01.2012, 14:13  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ja, eine Art Registry.
Zitat:
oder was würdet Ihr an meinem Autoloader alles ändern?
Alles was diesem Zweck dient.
Zitat:
( ich vermute Ihr kennt das Script )
Offenbar ist das alte Script schon nicht von Dir, also erwarte bitte nicht, dass Dir hier jemand das nächste für umsonst schreibt.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 31.01.2012, 14:24  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 1.141
PHP-Kenntnisse:
Anfänger
hausl wird schon bald berühmt werdenhausl wird schon bald berühmt werden
Standard

http://professionelle-softwareentwic....autoload.html
__________________
Keine Zahl != ein Zeichen das keine Zahl ist
hausl ist offline   Mit Zitat antworten
Alt 31.01.2012, 16:25  
Erfahrener Benutzer
 
Benutzerbild von Wolfsblut
 
Registriert seit: 30.12.2011
Beiträge: 208
PHP-Kenntnisse:
Fortgeschritten
Wolfsblut wird schon bald berühmt werden
Standard

Zitat:
Zitat von GELight Beitrag anzeigen
Ich hätte gern
... die Möglichkeit, meine Klassen beliebig in Verzeichnisse zu packen aber dennoch per Autoloader "irgendwie" die Klassen automatisch finden und einbinden.
Voraussetzung: klassenname == datainame.php == unique im ganzen Projekt

Der Autoloader versucht die Klasse dann in einem Klassen-Cache zu finden. Wird sie dort nicht gefunden, wird das Filesystem nach der Klasse durchsucht und der Pfad zu dieser im Cache eingetragen.

So toll der Ansatz sich auch bei mini Projekten "anfühlt", so bescheiden wird das bei größeren, da die Einschränkung auf einmalige Klassennamen einem schnell Grenzen aufzeigt und u.a. einen mit immer schrägeren Namen bestraft.

Namespaces geben diesem Ansatz dann sowieso den Rest.

Ich würde Deinen Wunsch knicken und gleich Autoloading mit Namespaces nach PSR-0 implementieren, da Du so oder so die Klassen irgendwo verdrahten musst.

https://github.com/php-fig/fig-stand...epted/PSR-0.md
Wolfsblut ist offline   Mit Zitat antworten
Alt 31.01.2012, 19:25  
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 184
PHP-Kenntnisse:
Anfänger
GELight sorgt für eine eindrucksvolle AtmosphäreGELight sorgt für eine eindrucksvolle Atmosphäre
GELight eine Nachricht über ICQ schicken GELight eine Nachricht über MSN schicken
Standard Autoloader

Alles klar... ich denke ich habs verstanden.
Ich werd eure Anregungen und Tipps mal nutzen um mir was einfallen zu lassen.

Das mit dem PSR-0 sieht auch sehr vielversprechend aus.

Gruß Mario
GELight ist offline   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] Klassen untereinander verfügbar bongo44 PHP Einsteiger 8 26.09.2011 09:17
[Erledigt] Zend Autoloader findet Klassen für bestimmte Modules nicht dreamcatcher PHP Einsteiger 6 07.07.2011 23:50
[Erledigt] OOP - Klassen richtig Designen, aber wie? Yamo PHP Einsteiger 8 01.01.2011 12:03
Wozu brauche ich eigentlich eine abstrakte Klasse? echo PHP Tipps 2010 28 24.11.2010 17:10
[Erledigt] Wie Objekte von Klassen zusammenführen total2121 PHP Tipps 2009 6 19.10.2009 14:22
[Erledigt] Autoloader und einbinden von PEAR-Klasse Daniel86 PHP-Fortgeschrittene 2 02.09.2009 15:12
Mehrere Klassen verknüpfen BlackJack01090 Software-Design 9 26.05.2009 20:43
Modulare Programmierung - Klassen nur in Klassen Gültig iXtends Software-Design 6 26.05.2009 15:37
Fragen zu Klassen Kein Genie PHP Tipps 2006 3 08.05.2006 11:25
Sessions an includete Klassen übergeben Dr_Enquinox PHP Tipps 2006 4 29.04.2006 10:25
mit html klassen definieren und in php ausgeben PHP-Fortgeschrittene 4 16.01.2006 10:31
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46
Klassen PHP Tipps 2005 5 09.04.2005 18:51
Klassen in Klassen verwenden PHP Tipps 2005 5 23.02.2005 14:08

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
smarty per autoload namespace

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:45 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