PHP'de OOP'de Sınıflar için Özel Otomatik Yükleme Fonksiyonu
Genellikle varsayılan otomatik yükleme sizi bazı nedenlerden dolayı memnun etmeyebilir. Bu gibi durumlarda kendi otomatik yüklemenizi yazabilirsiniz.
Bunun için, spl_autoload_register fonksiyonuna
ilk parametre olarak yazdığınız geri çağırım fonksiyonunu
iletmeniz gerekir. Bu fonksiyon, PHP yüklenmemiş bir sınıfa
erişim tespit ettiğinde çağrılacaktır. Bu fonksiyonun parametresine
isim alanı ile birlikte sınıf adı gelecektir:
<?php
spl_autoload_register(function($class) {
// $class değişkeninde isim alanı ile birlikte sınıf adı olacak
});
?>
Ve fonksiyonun görevi, sınıf adına göre
bu sınıfı require ile yüklemektir.
Yani bu fonksiyonun içinde sınıf yükleme için
kendi kuralımızı, yani kendi isimlendirme
anlaşmamızı yazmalıyız.
Hadi bir örnek kendi otomatik yükleme fonksiyonumuzu yazalım. Örneğin, diyelim ki sınıf dosyasının site kökünden itibaren yolu, isim alanı ile aynı olacak, ancak karakterlerin büyük/küçük harf durumu korunacak.
Yani, eğer Core\Admin\PageController sınıfımız varsa,
bunun yolu Core/Admin/PageController.php olmalıdır.
Gördüğünüz gibi, sınıf adını ve onun isim alanını dönüştürmek için
sadece ters eğik çizgileri düz eğik çizgilerle değiştirmemiz,
ve sınıf adına .php eklememiz gerekiyor. Bunu yapalım:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Ancak, dosya yolu için göreli bir yol elde edeceğiz (site köküne göre). Daha iyisi mutlak bir yol yapmaktır, işte şöyle:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Bir başka nüans daha var. Farklı işletim sistemlerinde
klasör yolu düz eğik çizgi veya ters eğik çizgi ile olabilir.
Kodumuzu işletim sisteminden bağımsız hale getirelim.
Bunun için, yol ayırıcı olarak düz eğik çizgi yerine,
içinde betiğimizin şu anda çalıştığı işletim sisteminin
doğru eğik çizgisini barındıran DIRECTORY_SEPARATOR
sabitini kullanacağız. Sonuçta aşağıdaki kodu elde ederiz:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Oluşturduğum otomatik yükleme fonksiyonunu test edin.
Kendi otomatik yükleme kuralınızı bulun ve uygulayın.