Co to jest Autoloading; jak używać rejestru autoload spl, autoload i SPL autoload?
Uczę się zaawansowanych standardów PHP i staram się wdrażać nowe i użyteczne metody. Wcześniej używałem __autoload
tylko do ucieczki w tym wiele plików na każdej stronie, ale ostatnio widziałem poradę na __autoload manual
Ale Ja naprawdę Nie wiem, jak wdrożyćSpl_autoload_register () zapewnia bardziej elastyczną alternatywę dla klasy autoloadingu. Z tego powodu użycie __autoload () jest zniechęcony i może zostać wycofany lub usunięty w przyszłości.
spl_autoload
oraz spl_autoload_register
3 answers
spl_autoload_register()
pozwala na rejestrację wielu funkcji (lub statycznych metod z własnej klasy Autoload), które PHP umieści w stosie/kolejce i wywoła sekwencyjnie po zadeklarowaniu "nowej klasy".
Więc 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 "jest nazwą klasy, którą próbujesz utworzyć instancję, PHP przekazuje tę nazwę jako ciąg znaków do spl_autoload_register()
, co pozwala podnieść zmienną i użyć jej do" włączenia " odpowiedniej klasy/pliku. W rezultacie nie w szczególności należy włączyć tę klasę za pomocą instrukcji include/require...
Po prostu wywołaj klasę, którą chcesz utworzyć, jak w powyższym przykładzie, a ponieważ zarejestrowałeś własną funkcję (poprzez spl_autoload_register()
), która zorientuje się, gdzie znajdują się wszystkie Twoje klasy, PHP użyje tej funkcji.
Zaletą używania spl_autoload_register()
jest to, że w przeciwieństwie do __autoload()
nie musisz implementować funkcji autoload w każdym utworzonym pliku. spl_autoload_register()
pozwala również na rejestrację wielu funkcje automatycznego ładowania przyspieszają automatyczne ładowanie i sprawiają, że jest to jeszcze łatwiejsze.
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 stwierdza:
Ta funkcja ma być używana jako domyślna implementacja
__autoload()
. Jeśli nie podano nic innego ispl_autoload_register()
zostanie wywołana bez żadnych parametrów, to ta funkcja będzie używana do późniejszego wywołania__autoload()
.
W bardziej praktyczny sposób, jeśli wszystkie pliki znajdują się w jednym katalog i Twoja aplikacja używa nie tylko .Pliki php, ale niestandardowe pliki konfiguracyjne z .rozszerzenia inc na przykład, jedną ze strategii, której możesz użyć, byłoby dodanie katalogu zawierającego wszystkie pliki do ścieżki dołączania PHP (poprzez set_include_path()
).
A ponieważ potrzebujesz również plików konfiguracyjnych, możesz użyć spl_autoload_extensions()
, aby wyświetlić listę rozszerzeń, których PHP ma szukać.
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ą metody magicznej __autoload()
, PHP wywoła spl_autoload, gdy spróbujesz utworzyć nową klasę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-14 22:17:50
Od wersji PHP 5.3, możesz używać spl_autoload_register()
z przestrzeniami nazw, co oznacza, że możesz organizować swój projekt i automatycznie ładować swoje klasy php bez żadnych wymagań lub dołączania i bez redefiniowania funkcji __autoload()
.
Aby zademonstrować takie zachowanie, wystarczy utworzyć plik o nazwie index.php:
<?php
spl_autoload_register();
var_dump(new Main\Application);
Następnie utwórz folder o nazwie Main znajdujący się tuż obok indeksu.plik php. Na koniec tworzy plik o nazwie aplikacja.php znajduje się w Main i wklej do niego następujący kod:
<?php namespace Main;
class Application{}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-13 14:32:24
Oto sposób, w jaki używam Autoload. W podanym przykładzie chcę załadować klasy z 3 różnych katalogów.
function namespaceAutoload($rawClass){
$class = str_replace('\\', DIRECTORY_SEPARATOR, $rawClass);
$possiblePaths[] = '..\sys\class\file.php';
$possiblePaths[] = '..\sys\class\lib\file.php';
$possiblePaths[] = '..\sys\class\class.file.inc.php';
foreach ($possiblePaths as $templatePath) {
$path = str_replace(["\\", "file"], [DIRECTORY_SEPARATOR, $class], $templatePath);
if (file_exists($path)) {
require_once "$path";
break;
}
} spl_autoload_register("namespaceAutoload");
W podanym przykładzie PHP będzie szukać przestrzeni nazw\klasy w tych trzech katalogach używając tych trzech różnych formatów nazw plików.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-23 18:57:24