Pašu veidota funkcija klases automātiskai ielādei OOP PHP
Bieži vien noklusējuma automātiskā ielāde var jūs neapmierināt kādu iemeslu dēļ. Šādā gadījumā var uzrakstīt savu automātisko ielādi.
Lai to izdarītu, funkcijai spl_autoload_register
kā pirmo parametru jānodod jūsu sarakstītā
atgriezeniskā saite (callback) funkcija. Šī funkcija tiks izsaukta,
kad PHP atklās piekļuvi
neielādētai klasei. Šīs funkcijas parametrā
tiks iegūts klases nosaukums ar nosaukumu telpu:
<?php
spl_autoload_register(function($class) {
// mainīgajā $class būs klases nosaukums ar nosaukumu telpu
});
?>
Un funkcijas pienākums būs pēc klases nosaukuma
veikt šīs klases ielādi caur require.
Tas ir, šīs funkcijas iekšienē mums jādefinē
savs noteikums klases ielādei, tas ir,
savu nosaukšanas konvenciju.
Uzrakstīsim kādu piemēru savas automātiskās ielādes. Pieņemsim, piemēram, ka mēs nosakām, ka ceļš uz klases failu no vietnes saknes būs tāds pats kā nosaukumu telpa, bet saglabājot simbolu reģistru.
Tas ir, ja mums ir klase Core\Admin\PageController,
tad ceļš uz to vajadzētu būt Core/Admin/PageController.php.
Kā jūs redzat, lai pārveidotu klases nosaukumu
ar tā nosaukumu telpu vajag vienkārši nomainīt
reversos slīpsvītras uz tiešajām, bet klases nosaukumam
pievienot .php. Darīsim to:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Tomēr mēs iegūsim relatīvo ceļu uz failu (attiecībā pret vietnes sakni). Labāk izveidot absolūto ceļu, šādi:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Ir vēl nianse. Dažādās operētājsistēmās
ceļš pa mapēm var būt ar tiešo slīpsvītru
vai ar reverso. Padarīsim mūsu kodu neatkarīgu
no operētājsistēmas. Lai to izdarītu, tā vietā, lai
tiešo slīpsvītru ceļu atdalīšanai, izmantosim
konstantu DIRECTORY_SEPARATOR,
kas satur pareizo slīpsvītru tās operētājsistēmas,
kādā šobrīd tiek palaists mūsu
skripts. Rezultātā iegūstam šādu kodu:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Pārbaudiet manis izveidoto automātiskās ielādes funkciju.
Izdomājiet savu automātiskās ielādes noteikumu un realizējiet to.