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

Testoni funksionin e krijuar nga unë për autoloading.

Задание 2

Shpikni rregullin tuaj për autoloading dhe implementojeni atë.