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 31.01.2012, 23:51  
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

Ich bräuchte eure Hilfe doch nochmal...
Habe mir anhand deines Links zu diesem PSR-0 SplClassLoader diese Variante der Klasse geholt und will sie gern einsetzen.

https://gist.github.com/1335891

Das Problem ist.... ich bekomm es nicht gebacken, wie ich sie korrekt einsetze.
Ich verstehe noch nicht, wie die Namespaceangabe und wie die Pfadangabe zueinander sein muss.

Das hier ist zB. meine Verzeichnisstruktur:

-- projectRootVerzeichnis ( hier befinde ich mich sozusagen )
----- backend
-------- res
----------- classes
-------------- Base
----------------- Backend.class.php
----------------- Logger.class.php
-------------- Helper
---------------- Functions.class.php
----------- libs
-------------- Smarty
----------------- Smarty.class.php
----- frontend

Wie wende ich das jetzt korrekt an, wenn ich zB. die Backend oder Logger Klasse oder auch die Functions oder Smarty Klassen anwenden möchte?
Hatte eben alles mögliche versucht und am ende auch mit einem kleinen Example nicht weiter gekommen was ich versucht habe auf meins hier anzuwenden:
PHP-Code:
$loader = new SplClassLoader('Base\Backend', array('/backend/res/classes/Base/Backend'));
// $loader->setNamespaceSeparator('_');
$loader->register(); 
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 01.02.2012, 00:34  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Code:
$loader = new SplClassLoader('Base', '/backend/res/classes/Base');
$loader->register();

use Base\Backend;
$class = new Backend;

Die Backend.class.php müsstet du entsprechend in Backend.php umbenennen.

Edit: Der PHP-Code-Tag mag keinen Backslash ...

Geändert von Trainmaster (01.02.2012 um 00:38 Uhr).
Trainmaster ist gerade online   Mit Zitat antworten
Alt 01.02.2012, 02:40  
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

zu deinem Eingangspost:

PHP-Code:
final class Autoloader {

    private static
        
$backendPath null,
        
$instance null;

    public static function 
enable$backendPath ) {
        
self::$_instance is_null(self::$_instance) ? new self self::$instance;
        
$backendPath is_array($backendPath) ? join(DIRECTORY_SEPARATOR$backendPath) : $backendPath;
        
self::$backendPath realpath($backendPath) ? realpath($backendPath) : null;
    }
    
    public static function 
disable() {
        
self::$_instance null;
        
self::$backendPath null;
    }
    
    protected function 
__construct() {
        
spl_autoload_register(array($this'autoload'));
    }
    
    public function 
__destruct() {
        
spl_autoload_unregister(array($this'autoload'));
    }
    
    public function 
autoload$classname ) {
        
// extract namespaces
        
$classArray explode("\\"$classname);
        
        
// get classname
        
$myclass array_pop($classArray);
        
        
// get namespace-stages as Directory-Path:
        
$mynsDir join(DIRECTORY_SEPARATOR$classArray);
        
$myclassFile $myclass.'.class.php';
        
        
// check availability
        
$there realpath(join(DIRECTORY_SEPARATOR, array($mynsDir$myclassFile)));
        
$readable is_string($there) ? is_readable($there) : false;
        
        if ( 
$there && $readable ) {
            
// -- inform processSuccess observer here
            
require_once $there;
            return 
true;
        }
        
        
// -- inform processFailed observer here
        
return false;
    }


PHP-Code:
Autoloader::enable('myfiles/here');

// oder

Autoloader::enable(array('myfiles','here')); 
splClassLoader in allen Ehren, aber eine PHP-Extension extra auf einem Webspace zu installieren nur damit ein Projekt einen Class-Loading-Mechanismuss hat ist mit Panzern auf Spatzen ballern.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 01.02.2012, 04:17  
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

Extension installieren?

Was generell die Autoloader angeht: Es ärgert mich, dass jedes Projekt und jede Library praktisch einen mitliefern muss, weil einfach kein Standard existiert. Da muss dringend was in den Core.
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (01.02.2012 um 04:23 Uhr).
mermshaus ist gerade online   Mit Zitat antworten
Alt 01.02.2012, 06:07  
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

der SPLAutoLoader der in der gitList gebaut wurde und oben verlinkt ist, wurde weiterentwickelt als PHP-Extension.

Prinzipiell hat PHP bereits einen Autoloader, der muss nur initialisiert werden und das auch nur weil halt nicht jede Anwendung gleich aufgebaut ist.

PHP-Code:
function __autoload$classname ) {
        
// extract namespaces
        
$classArray explode("\\"$classname);
        
        
// get classname
        
$myclass array_pop($classArray);
        
        
// get namespace-stages as Directory-Path:
        
$mynsDir join(DIRECTORY_SEPARATOR$classArray);
        
$myclassFile $myclass.'.class.php';
        
        
// check availability
        
$there realpath(join(DIRECTORY_SEPARATOR, array($mynsDir$myclassFile)));
        
$readable is_string($there) ? is_readable($there) : false;
        
        if ( 
$there && $readable ) {
            require_once 
$there;
            return 
true;
        }
        
        return 
false;

Und man ist damit durch, so what ?

natürlich sind (halb)fertige SplObjectiveAutoload-Objekte schön, kurzfristig aber nur schwerer wartbar als eine eigene Autoload-Klasse / Autoload-Funktion, da du dich dadurch an ein wahrscheinlich dafür vorgesehenes Autoload-Interface festlegen musst, was für universelle Zwecke geschaffen wurde, wovon du aber nicht annähernd die gesamte funktionalität brauchst.

Von daher: Autoload-SPL-Klasse, nicht notwendig.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 01.02.2012, 09:48  
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

Könnten externe Module/Klassen die man einbindet auch __autoload() enthalten? In so einem Fall würde das oben dann nicht funktonieren, müsste man mit spl_autoload...() arbeiten, richtg ( wegen mehrfachdeklaration von __autoload() )?
__________________
Keine Zahl != ein Zeichen das keine Zahl ist
hausl ist offline   Mit Zitat antworten
Alt 01.02.2012, 10:00  
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

Zitat:
Zitat von hausl Beitrag anzeigen
Könnten externe Module/Klassen die man einbindet auch __autoload() enthalten? In so einem Fall würde das oben dann nicht funktonieren, müsste man mit spl_autoload...() arbeiten, richtg ( wegen mehrfachdeklaration von __autoload() )?
Jo klar und weiter ? die SPL ( Standard PHP Library ) ist bereits bestandteil des Cores.. ändert nix daran das autoloading-mechanismen bereits genügend eingebaut sind und nicht weiter Objektorientiert implementiert werden müssen, da die vielfalt die ein Autoloader mitbringen würde das ganze auf eine so universelle ebene schiebt, die uns ( den Entwickeln ) nur ein weiteres Interface bereitstellt, wovon - wie schon erwähnt - fallspezifisch die hälfte genutzt wird. die SPL-Pseudo-Registry über die bestehenden SPL-Autoloader-Funktionen bietet mehr als genug möglichkeiten, siehe Vor-vor-post.

Die aktuelle SPL-Lösung bietet sogar möglichkeiten bestehende Autoloader-Mechanismen nachdem Komponenten-Bootstrap in den eigenen Autoloader zu importieren, du kannst also weitaus mehr "jetzt schon" tun, als das Klassenkonstrukt ( bspw. als AutoloadIterator-ähnliches Gebilde ) an Vorteile bringen würde.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (01.02.2012 um 10:04 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 01.02.2012, 11:14  
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

Wow, das ist ja ein Meinungs- und Erfahrungshagel von euch hier.
Jetzt bin ich gleich wieder ganz erschlagen und weiß nicht, was ich machen soll.

Vorweg aber zu "__autoload":
Im Manual steht, dass man diese Funktion möglichst nicht mehr verwenden sollte, weil sie veraltet sei.
..."spl_autoload_register() bietet eine flexiblere Alternative zum automatischen Laden von Klassen an. Aus diesem Grund wird von der Verwendung von __autoload() abgeraten und diese Funktion könnte zukünftig als veraltet gekennzeichnet oder gar entfernt werden."...

@Trainmaster:
Danke für das Beispiel. Werde ich heute gleich testen ...

@tr0y:
Vielen Dank auch für dein Script. Auch das werde ich mal versuchen zu benutzen.
Zum Thema PHP-Extension ... ich hab nichts extra installieren müssen und arbeite gerade beim Testen und schreiben meiner Scripte immer möglichst mit dem PHP Standard, der auch auf den meisten Public-Servern so aktiviert ist.

Also wenn ich mir das alles so anschaue so denke ich, dass es doch auch mit eine Frage der eigenen Philosophie ist, was man eben wie braucht und was nicht.
Die SplClassLoader Klasse, die ich verwenden will, klingt für mich ansich sehr sehr hilfreich ( wenn man einmal weiß, wie man sie nutzen muss )
An uns für sich ist es doch auch nur eine Art Wrapper, der die PHP Funktionalitäten ( egal ob im Core oder sonstwo zur Verfügung ) nochmals einbettet und "schöner benutzbar" zur verfügung stellt oder nicht? Wenn ich also damit ( oder auch mit deiner Variante "tr0y" ) schaffe relativ sauber einen Mechanismus zu haben, der mir beim Nachladen der Klassen behilflich ist, dann ist das doch schonmal super und man hat "eine" globale Stelle, wo dies gehändelt wird.
Vielleicht kommt ja irgendwann mal was Seitens PHP ( Core ), wo man garnix mehr machen muss und PHP die Klassen selbststndig zur Verfügung stellt etc..... wer weiß...

Auf jeden Fall ( auch um den Post hier nicht ausufern lassen zu wollen ) würde ich sagen, ich probiere alle eure Tipps, Gedanken und Hilfen erst einmal aus und versuche sie zu verwenden.

... besser geht irgendwo ja immer ...

Gruß Mario
GELight ist offline   Mit Zitat antworten
Alt 01.02.2012, 11:30  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.167
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
aber dennoch selbst entscheiden kann, in was für eine Ordnerstruktur ich sie unterhalb von backend/res/classes/ ablege.
Das ist doch schon grundlegend eine schlechte Idee? Warum sollen da verschiedene Strukturen existieren? Wenn man sich das ein halbes Jahr später anschaut, weiß keiner mehr, warum hier eine Klasse einer anderen Konvention folgt, als eine andere. Falls fremde Bibliotheken eingebunden werden sollen, wäre es besser, die in ein separates Verzeichnis zu legen und diesen dann ggf. jeweils einen Autoloader zu spendieren (Sofern die nicht selber einen mitbringen). Aber das ist in jedem Fall besser, als alles mögliche mit einem Autoloader erschlagen zu wollen.

Warum nur benennen immer wieder Leute ihre Dateien *.class.php? Es ist doch völlig klar, dass dort eine Klasse drin ist. Wie viele Dateien hat eine Applikation heutzutage noch, die keine Klassen beinhalten, außer irgendwelche Bootstrappings vielleicht?
xm22 ist offline   Mit Zitat antworten
Alt 01.02.2012, 13:12  
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

Hi xm22,

Ich meinte damti auch nur, dass ich meine Klassen möglichst nicht alle in ein Verzeichnis packen muss. Die Klassen sollen halt auch von der Ordnerstruktur her sauber abgelegt werden können.

Daher die SplAutloader Klasse.... sofern ich mal verstehe, wie ich die anzuwenden habe ( bin aber gerade noch auf Arbeit und hab keine Zeit dafür)

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
splclassloader tutorial, php methoden in extension nutzen nicht autoloader

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