spl_autoload_register()
pozwala zarejestrować wiele funkcji (lub metod statycznych z własnej klasy Autoload), które PHP umieści w stosie / kolejce i wywoła sekwencyjnie, gdy zadeklarowana zostanie „nowa klasa”.
Na przykład:
spl_autoload_register('myAutoloader');
function myAutoloader($className)
{
$path = '/path/to/class/';
include $path.$className.'.php';
}
//-------------------------------------
$myClass = new MyClass();
W powyższym przykładzie „MyClass” to nazwa klasy, którą próbujesz utworzyć, PHP przekazuje tę nazwę jako ciąg znaków spl_autoload_register()
, co pozwala ci pobrać zmienną i użyć jej do „włączenia” odpowiedniej klasy / pliku . W rezultacie nie musisz specjalnie uwzględniać tej klasy za pomocą instrukcji włączania / żądania ...
Wystarczy wywołać klasę, którą chcesz utworzyć, jak w powyższym przykładzie, a ponieważ zarejestrowałeś własną funkcję (via spl_autoload_register()
), która zorientuje się, gdzie znajdują się wszystkie klasy, PHP użyje tej funkcji.
Zaletą korzystania spl_autoload_register()
jest to, że w przeciwieństwie do __autoload()
tego, nie trzeba implementować funkcji automatycznego ładowania w każdym tworzonym pliku. spl_autoload_register()
pozwala także zarejestrować wiele funkcji automatycznego ładowania, aby przyspieszyć automatyczne ładowanie i jeszcze bardziej ułatwić.
Przykład:
spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');
class MyAutoloader
{
public static function ClassLoader($className)
{
//your loading logic here
}
public static function LibraryLoader($className)
{
//your loading logic here
}
W odniesieniu do spl_autoload instrukcja mówi:
Ta funkcja ma być używana jako domyślna implementacja dla __autoload()
. Jeśli nic innego nie zostanie określone i nie spl_autoload_register()
zostanie wywołane bez żadnych parametrów, funkcje te zostaną wykorzystane do późniejszego wywołania __autoload()
.
Mówiąc prościej, jeśli wszystkie pliki znajdują się w jednym katalogu, a aplikacja używa nie tylko plików .php, ale także niestandardowych plików konfiguracyjnych z rozszerzeniami .inc, na przykład, jedną ze strategii, którą można zastosować, byłoby dodanie katalogu zawierającego wszystkie pliki do PHP zawierają ścieżkę (via set_include_path()
).
A ponieważ potrzebujesz również plików konfiguracyjnych, użyjesz spl_autoload_extensions()
listy rozszerzeń, których ma szukać PHP.
Przykład:
set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();
Ponieważ spl_autoload jest domyślną implementacją __autoload()
magicznej metody, PHP wywoła spl_autoload podczas próby utworzenia nowej klasy.
Mam nadzieję że to pomoże...
spl_autoload_register()
(i__autoload()
ogólnie) tego, że leniwe ładunki obejmują pliki / klasy? Jest to sugerowane przez odpowiedź, ale nie jest wyraźnie określone. Dla mnie jest to krytyczna informacja, która byłaby idealna do włączenia do twojej odpowiedzi! :)Od PHP 5.3 możesz używać
spl_autoload_register()
przestrzeni nazw, co oznacza, że możesz organizować swój projekt i automatycznie ładować swoje klasy php bez żadnych wymagań, bez włączania i bez redefiniowania__autoload()
funkcji.Aby zademonstrować to zachowanie, po prostu utwórz plik o nazwie index.php:
Następnie utwórz folder o nazwie Main znajdujący się obok pliku index.php. Na koniec tworzy plik o nazwie Application.php umieszczony w Main i wklej do niego następujący kod:
źródło
spl_autoload_register()
domyślna implementacja nie może znaleźć odziedziczonych klas. Tak więc używając domyślnych, małych liter i katalogów odzwierciedlających ścieżkę przestrzeni nazw, wszystko działa dobrze, chyba że mam klasę, która rozszerza inną klasę (rodzica). Następnie PHP zgłasza błąd, że nie może znaleźć tej klasy nadrzędnej, nawet jeśli wszystkie są w tym samym katalogu / przestrzeni nazw! Mylące jest to, że dosłownie można znaleźć tylko klasy pierwszego poziomu, więc musiałem umieścić kolejnąspl_autoload_register()
z anonimową regułą funkcji tuż po pierwszej, aby ręcznie włączyć brakujące klasy nadrzędne / dziedziczone.Oto sposób korzystania z funkcji Autoload. W podanym przykładzie chcę załadować klasy z 3 różnych katalogów.
W podanym przykładzie PHP wyszuka przestrzeń nazw \ class w tych trzech katalogach, używając tych trzech różnych formatów nazw plików.
źródło