Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] zasięg autoloadera
Forum PHP.pl > Forum > PHP > Object-oriented programming
KotWButach
Witam

Mam problem z którym nie umiem sobie poradzić żadne wygłuszanie czy też try-e nie działają.

Więc pomyślałem że napiszę.

AUTOLOADER zbudowany jest na
  1. spl_autoload_register


problem w tym ze gdy includuje jakis plik z katalogu którego autoloader nie obejmuje (MA NIEOBEJMOWAC) otrzymuje fatal error... przy probie utworzenia klasy.

Jak ograniczyć zasięg autoloadera?
Crozin
Jeżeli dany autoloader nie jest wstanie wczytać danej klasy, powinien zwrócić wartość false. Zadanie wczytania klasy zostanie wtedy oddelegowane do następnego autoloadera.
KotWButach
Jest jeden autoloader.

Nie ma więcej

Wczytuje moduł powiedzmy logowania i tam już autoloader nie powinien zaglądać ale wywala fatala.


w skrócie jak go ograniczyć do kilku katalogów?
Crozin
Możesz napisać co chciałbyś uzyskać? Bo wydaje mi się, że próbujesz zrobić coś w dziwny/błędny sposób. Skoro jest jeden autoloader, który z jakiś przyczyn nie może wczytać pliku z klasą co niby innego miałby interpreter zrobić jak nie rzucić fatalem?
KotWButach
Mam główny plik index w ktorym jest utworzony obiekt klasy auloloader.
mam katalogi w tym katalog lib oraz mod

w ktalogu 'lib' znajduje sie plik z klasa 'module' który ma za zadanie wczytywać moduły.
Jedna z metod używa do wczytania modułu z katalogu 'mod' własnie 'require_once' i jeżeli jest klasa to tworzy obiekt. I moduł działał by gdyby nie fatal error który nie powinien był się pojawić. A już napewno autoloader nie powinien mi zaglądać w moduły więc tam mam namespace.

Ale jak rozwiązac problem z require w katalogu mod?
Crozin
Jeżeli masz require_once przed użyciem danej klasy, to nie ma możliwości by autoloader w ogóle się aktywował, problem musisz mieć z czymś innym - pokaż SSCCE.

PS. Dlaczego nie zastosujesz się do PSR-0 i nie skorzystasz z gotowego autoloadera?
franki01
Funkcją autoloadera nie jest zainicjowanie objektu, ale przygotowanie do jego inicjacji. Samo utworzenie objektu leży ciągle w kwestii interpretera php i jak sądze, on wyrzuca błąd. Jeżeli funkcja autoloadera nie przygotowała dobrze środowiska do utworzenia objektu (np. nie zaincludowała pliku z odpowiednią klasą), PHP nie będzie w stanie utworzyć owego objektu i wyrzuca fatal error.

Musisz znaleźć inny sposób na sprawdzanie czy klasa istnieje. Na pewno nie obędzie się bez class_exists(), być może wcześniejszym file_exists() oraz require_once(), żeby w końcu móc sprawdzić czy klasa jest w pliku. Innego sposobu dostępnego z czystego PHP do tej pory nie widziałem.
KotWButach
SSCCE <-- nie wiem co to jest a i przetłumaczyć zbyt trafnie nie potrafię a szkoda...

Co do klasy którą podałeś taka sama reakcja pomimo że mam kod

  1. include_once 'class.php';
  2. $cos = new klasa();


to nie działa


czy w takim wypadku wskazane było by użycie __autoloadera jako że on jak nie ma podane co i jak to nie szuka dalej... Nie wiem czy to dobrze określiłem ale z tą nie mam problemu...
adbacz
Po pierwsze, pokaż błąd - tam powinno pisać co jest nie tak. Po drugie, czy mógłbyś pokazać tutaj większą część kodu? Np co znajduje się w pliku class.php?
greycoffey
Cytat(KotWButach @ 16.07.2012, 01:04:04 ) *
SSCCE <-- nie wiem co to jest a i przetłumaczyć zbyt trafnie nie potrafię a szkoda...


Short, Self Contained, Correct Example

Short (Small) - Minimise bandwidth for your example, do not bore the audience.
Self Contained - Ensure everything is included, ready to go.
Correct - Copy, paste, (compile,) see is the aim.
Example - Displays the problem you are trying to solve.
sazian
Cytat(adbacz @ 17.07.2012, 00:27:31 ) *
Po pierwsze, pokaż błąd - tam powinno pisać co jest nie tak. Po drugie, czy mógłbyś pokazać tutaj większą część kodu? Np co znajduje się w pliku class.php?

po trzecie pokarz autoloader
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.