PHP-də OOP-də siniflər üçün avtomatik yükləmə funksiyasının yaradılması
Tez-tez standart avtomatik yükləmə müəyyən səbəblərə görə sizi qane etməyə bilər. Belə bir halda öz avtomatik yükləmə funksiyanızı yaza bilərsiniz.
Bunun üçün spl_autoload_register funksiyasına
ilk parametr kimi yazdığınız callback funksiyasını ötürməlisiniz.
Bu funksiya PHP yüklənməmiş sinifə müraciət aşkar etdikdə
çağırılacaq. Bu funksiyanın parametrinə ad sahəsi olan
sinfin adı düşəcək:
<?php
spl_autoload_register(function($class) {
// $class dəyişənində ad sahəsi olan sinfin adı olacaq
});
?>
Funksiyanın vəzifəsi isə sinfin adına əsasən həmin sinfi
require ilə yükləməkdir. Yəni bu funksiyanın daxilində
biz siniflərin yüklənməsi üçün öz qaydamızı, başqa sözlə
öz adlandırma konvensiyamızı təyin etməliyik.
Gəlin öz avtomatik yükləməmiz üçün bir nümunə yazaq. Məsələn, fərz edək ki, sinif faylına olan yol saytın kökündən ad sahəsi ilə eyni olacaq, lakin simvolların registri saxlanılacaq.
Yəni, əgər bizim Core\Admin\PageController sinfimiz varsa,
onda ona olan yol Core/Admin/PageController.php olmalıdır.
Gördüyünüz kimi, sinfin adını onun ad sahəsi ilə çevirmək üçün
əks sləşları düz sləşlarla dəyişmək və sinfin adına
.php əlavə etmək kifayətdir. Gəlin bunu edək:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Lakin, bizim fayla nisbi yol (saytın kökünə nisbətən) alınacaq. Absolyut yol etmək daha yaxşıdır, belə:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Başqa bir nüans da var. Müxtəlif əməliyyat sistemlərində
qovluqlar arası yol düz sləş və ya əks sləş ilə ola bilər.
Gəlin kodumuzu əməliyyat sistemindən asılı olmayan edək.
Bunun üçün yol ayırıcısı kimi düz sləş yerinə,
skriptimizin hazırda işə salındığı əməliyyat sisteminin
düzgün sləşini ehtiva edən DIRECTORY_SEPARATOR sabitindən
istifadə edəcəyik. Nəticədə aşağıdakı kodu alarıq:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Yaratdığım avtomatik yükləmə funksiyasını sınayın.
Öz avtomatik yükləmə qaydanızı düşünün və onu reallaşdırın.