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

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.

Ale Ja naprawdę Nie wiem, jak wdrożyć spl_autoload oraz spl_autoload_register
Author: Machavity, 2011-10-04

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 i spl_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ę.

Mam nadzieję, że to pomoże...
 355
Author: Brownbay,
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{}
 14
Author: user1974206,
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.

 1
Author: Augusto Santana,
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