2013-02-13 13 views
6

Czy jest jakiś sposób na rozróżnienie cech i klas w funkcji automatycznego ładowania? Załóżmy, że mam folder zajęć i folder cech; miło byłoby móc zrobić coś takiego ...Automatyczne ładowanie właściwości w PHP

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

swój prawdopodobnie chcą zmienić swój drugi 'if' do' elseif' – shnisaka

+0

nie wygląda prawdopodobnie. Nie ma żadnych informacji poza nazwą symbolu przekazaną do wywołania zwrotnego. Prawdopodobnie powinieneś zgłosić błąd w PHP – Phil

+0

@shnisaka To nie ma sensu. Po co używać 'elseif', jeśli warunki wzajemnie się wykluczają? – Phil

Odpowiedz

4

Autoloadowa funkcja oddzwonienia otrzymuje tylko jedną informację; żądana nazwa symbolu. Nie ma sposobu, aby zobaczyć, jaki powinien być symbol.

Co można zrobić, to zarejestrować wiele funkcji w stosie autoload, jeden do obsługi klas i innych cech, za pomocą stream_resolve_include_path() lub coś podobnego, np

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

Dzięki, moim szybkim rozwiązaniem było użycie 'file_exists()'. Nigdy wcześniej nie użyłem 'stream_resolve_include_path()', a dokumentacja jest dość ogólnikowa ... co to dokładnie robi? Jakie zalety przynosi rejestracja dwóch funkcji automatycznych? –

+0

@savinger No cóż, 'include' używa skonfigurowanej' include_path'. 'file_exists()' nie wie o tym, podczas gdy 'stream_resolve_include_path()' robi. Zwraca 'false', jeśli nie może rozwiązać danej ścieżki ze stosu' include_path' – Phil

0

Istnieje proste rozwiązanie w sposób nazwa twoje cechy. Każda cecha w mojej aplikacji nosi nazwę trait_ (name) i jest umieszczana w folderze classes.

Na przykład moja trait_something jest umieszczana w katalogu/folderze pod nazwą "trait.trait_something.php".

Moja funkcja autoload może odebrać albo cechy lub klas:

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