2013-02-13 18 views
6

Gibt es eine Möglichkeit für mich, zwischen Merkmalen und Klassen in meiner Autoload-Funktion zu unterscheiden? Sagen wir, ich habe einen Ordner mit Klassen und einen Ordner mit Merkmalen; es wäre schön, der Lage sein, etwas zu tun ...Autoloading-Eigenschaften in PHP

spl_autoload_register(function($resource) { 
    if (/* $resource is class */) { 
    include 'classes/'.$resource.'.php'; 
    } 
    if (/* $resource is trait */) { 
    include 'traits/'.$resource.'.php'; 
    } 
}); 
+1

Sie wahrscheinlich wollen Ihren zweiten 'if' zu' ändern elseif' – shnisaka

+0

Ist wahrscheinlich nicht aussehen. Neben dem an den Callback übergebenen Symbolnamen gibt es keine Informationen. Sie sollten wahrscheinlich einen Bug mit PHP – Phil

+0

@shnisaka auslösen Das macht keinen Sinn. Warum sollte 'elseif' verwendet werden, wenn sich die Bedingungen gegenseitig ausschließen? – Phil

Antwort

4

Die Autoload Callback-Funktion erhält nur eine Information; der angeforderte Symbolname Es gibt keine Möglichkeit zu sehen, welche Art von Symbol es sein sollte.

Was Sie tun können, ist, mehrere Funktionen in der Autoload-Stapel registrieren, ein Klassen zu handhaben und die anderen Züge, mit stream_resolve_include_path() oder etwas ähnliches, wie zB

spl_autoload_register(function($className) { 
    $fileName = stream_resolve_include_path('classes/' . $className . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
spl_autoload_register(function($traitName) { 
    $fileName = stream_resolve_include_path('traits/' . $traitName . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
+0

Danke, meine schnelle Lösung war 'file_exists()' zu verwenden. Ich habe 'stream_resolve_include_path()' noch nie benutzt und die Dokumentation ist ziemlich vage ... was macht das genau? Und welche Vorteile ergeben sich durch die Registrierung von zwei Autoload-Funktionen? –

+0

@savinger Nun, 'include' verwendet den konfigurierten' include_path'. 'file_exists()' weiß darüber nichts, während 'stream_resolve_include_path() 'dies tut. Es gibt 'false' zurück, wenn es den gegebenen Pfad nicht gegen den 'include_path'-Stapel auflösen kann – Phil

0

Es gibt eine einfache Lösung in der Art und Weise Sie Namen deine Eigenschaften. Jedes Merkmal in meiner Anwendung hat den Namen trait_ (name) und es wird im Ordner classes abgelegt.

Zum Beispiel mein Trait_Something wird in den Klassen/Ordner unter dem Dateinamen "Trait.trait_something.php" platziert.

Meine Autoload-Funktion kann entweder die Züge oder die Klassen aufheben:

function autoloader($class) 
{ 
    $prefix='classes/'; 
    $ext='.php'; 
    if(substr($class,0,6) == 'trait_')include $prefix.'trait.' . $class . $ext; 
    else include $prefix.'class.' . $class . $ext; 
}