Lastna funkcija za samodejno nalaganje razredov v OOP v PHP
Pogosto vas privzeto samodejno nalaganje ne ustreza iz kakšnih koli razlogov. V takem primeru lahko napišete lastno avtomatsko nalaganje.
Za to morate v funkcijo spl_autoload_register
kot prvi parameter posredovati vašo napisano
funkcijo-povratni klic. Ta funkcija se bo klicala,
ko bo PHP zaznal dostop do
nenaloženega razreda. V parameter te funkcije
bo prišlo ime razreda z imenskim prostorom:
<?php
spl_autoload_register(function($class) {
// v spremenljivki $class bo ime razreda z imenskim prostorom
});
?>
Naloga funkcije pa je, da po imenu razreda
izvede nalaganje tega razreda prek require.
To pomeni, da moramo znotraj te funkcije določiti
lastno pravilo za nalaganje razredov, torej
lastno dogovor o poimenovanju.
Napišimo primer kakšne lastne samodejne nalaganje. Recimo, da trdimo, da naj bo pot do datoteke razreda od korena spletnega mesta enaka kot imenski prostor, vendar z ohranjanjem velikosti črk.
To pomeni, če imamo razred Core\Admin\PageController,
mora biti pot do njega Core/Admin/PageController.php.
Kot lahko vidite, je za pretvorbo imena razreda
z njegovim imenskim prostorom treba samo zamenjati
obratne poševnice s prečnimi, in k imenu razreda
dodati .php. Naredimo to:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Vendar bomo dobili relativno pot do datoteke (glede na koren spletnega mesta). Bolje je narediti absolutno pot, takole:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Obstaja še en odtenek. V različnih operacijskih sistemih
je lahko pot po mapah s prečno poševnico
ali z obratno. Naredimo našo kodo neodvisno
od operacijskega sistema. Za to bomo namesto
prečne poševnice za ločevanje poti uporabili
konstanto DIRECTORY_SEPARATOR,
ki vsebuje pravo poševnico tistega operacijskega
sistema, v katerem se trenutno zažene naš
skript. Na koncu dobimo naslednjo kodo:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Preizkusite funkcijo za samodejno nalaganje, ki sem jo ustvaril.
Spojmite lastno pravilo za samodejno nalaganje in ga implementirajte.