Oma luokkien automaattisen lataustoiminto OOP:lle PHP:ssä
Usein oletusarvoinen automaattinen lataus ei ehkä täytä tarpeitasi jostain syystä. Tällaisessa tilanteessa voit kirjoittaa oman automaattisen lataustoiminnon.
Tätä varten funktiolle spl_autoload_register
tulee välittää ensimmäisenä parametrina kirjoittamasi
takaisinkutsufunktio. Tätä funktiota kutsutaan,
kun PHP havaitsee viittauksen
ei-ladattuun luokkaan. Tämän funktion parametriin
tulee luokan nimi nimiavaruudella:
<?php
spl_autoload_register(function($class) {
// muuttujassa $class on luokan nimi nimiavaruudella
});
?>
Ja funktion tehtävänä on luokan nimen perusteella
suorittaa kyseisen luokan lataus require:n kautta.
Toisin sanoen tämän funktion sisällä meidän on määritettävä
oma sääntömme luokkien lataamiseksi, eli
oma nimeyssopimuksemme.
Kirjoitetaan esimerkki jostain omasta automaattisesta lataustoiminnosta. Oletetaan esimerkiksi, että sanomme, että tiedostopolku luokkaan sivuston juuresta on sama kuin nimiavaruus, mutta symbolien kirjainkoko säilyy.
Eli, jos meillä on luokka Core\Admin\PageController,
niin polku siihen pitäisi olla Core/Admin/PageController.php.
Kuten näette, luokan nimen muuntamiseksi
sen nimiavaruuden kanssa tarvitsee vain vaihtaa
käänteiset viivat suoriksi viivoiksi, ja luokan nimeen
lisätään .php. Tehdään näin:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Meillä kuitenkin saadaan suhteellinen polku tiedostoon (suhteessa sivuston juureen). On parempi tehdä absoluuttinen polku, näin:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
On vielä yksi vivahde. Eri käyttöjärjestelmissä
polku kansioiden läpi voi olla joko suoralla viivalla
tai käänteisellä viivalla. Tehdään koodistamme riippumaton
käyttöjärjestelmästä. Korvaamme tätä varten
suoran viivan polkujen erottamiseen vakiolla DIRECTORY_SEPARATOR,
joka sisältää oikean viivan sen käyttöjärjestelmän mukaisesti,
jossa skriptimme tällä hetkellä käynnistetään.
Lopputuloksena saamme seuraavan koodin:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testaa luomaani automaattisen lataustoimintoa.
Keksi oma sääntösi automaattiselle lataukselle ja toteuta se.