Funksioni i personal për autoloading e klasave në OOP në PHP
Shpesh autoloading-i parazgjedhur mund të mos ju përshtatet për arsye të caktuara. Në raste të tilla mund të shkruani autoloading-in tuaj.
Për këtë, në funksionin spl_autoload_register
duhet të kaloni si parametër të parë funksionin-callback
të shkruar nga ju. Ky funksion do të thirret
kur PHP do të zbulojë akses në
një klasë të pa-ngarkuar. Në këtë funksion
do të kalojë emri i klasës me hapësirën e emrave:
<?php
spl_autoload_register(function($class) {
// në variablin $class do të jetë emri i klasës me hapësirën e emrave
});
?>
Dhe detyra e funksionit është që nga emri i klasës
të kryejë ngarkimin e kësaj klase përmes require.
Kjo do të thotë brenda këtij funksioni ne duhet të shkruajmë
rregullin tonë për ngarkimin e klasave, pra
marrëveshjen tonë të emërtimit.
Le të shkruajmë një shembull të ndonjë autoloading-u të personal. Le të themi, për shembull, ne deklarojmë që rruga drejt skedarit të klasës nga rrënja e sajtit do të jetë e njëjtë si hapësira e emrave, por me ruajtjen të regjistrit të simboleve.
Kjo do të thotë, nëse kemi klasën Core\Admin\PageController,
atëherë rruga drejt saj duhet të jetë Core/Admin/PageController.php.
Siç e shihni, për transformimin e emrit të klasës
me hapësirën e saj të emrave duhet thjesht të ndryshoni
backslash-et në slash-a të drejtë, dhe te emri i klasës
të shtoni .php. Le ta bëjmë këtë:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Ne, megjithatë, do të kemi rrugë relative drejt skedarit (relative nga rrënja e sajtit). Më mirë të bëhet rrugë absolute, ja kështu:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Ka edhe një nuancë. Në sisteme të ndryshme operative
rruga përmes dosjeve mund të jetë me slash të drejtë
ose me backslash. Le ta bëjmë kodin tonë të pavarur
nga sistemi operativ. Për këtë, në vend
të slash-it të drejtë për ndarjen e rrugëve do të
vendosim konstanten DIRECTORY_SEPARATOR,
që përmban slash-in e duhur të atij sistemi
operativ, në të cilin aktualisht po xhirohet
skripti ynë. Si përfundim do të kemi kodin e mëposhtëm:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testoni funksionin e krijuar nga unë për autoloading.
Shpikni rregullin tuaj për autoloading dhe implementojeni atë.