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<?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<?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<?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<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $ds = DIRECTORY_SEPARATOR;
    
    $filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
    require($filename);
  });
?>
Задание 1

Pārbaudiet manis izveidoto automātiskās ielādes funkciju.

Задание 2

Izdomājiet savu automātiskās ielādes noteikumu un realizējiet to.