Bugün sizlerle PHP'de yoğun bir şekilde çalışırken her yerde include'lar ve class'ların uçuştuğu bir projenin kurtarıcısı olan bir yapı olan "autoloader" namıdiğer "spl_autoload_register" ı anlatacağım.
Autoloader Nedir?
Projelerimiz büyüdükçe, sistemlerimizi OOP ile çalışan modüler yapılarda yazmaya başladıkça veya Class yapısını öğrendiğimiz ilk andan itibaren her dosyamızın içinde namespaceler ve class include'ları uçuşmaya başlar.
Bu noktada dosya sayımız büyüdükçe ve klasörler yapımız genişledikçe include için gereken path'i belirtmede hatalar veya unutmalarda büyümeye başlar.
Bu durumda karşımıza Autoloader yapısı için biçilmiş kaftan olan spl_autoload_register fonksiyonu çıkar.
Bu fonksiyon masterpage'inize - genelde index.php dosyanıza - eklendiği andan itibaren index.php tarafından çağırılan ve yönetilen hiçbir dosyanızda include kullanmamanızı sağlar.
Ancak bunu tabikide herşeyi pat pat yığınla yükleyerek yapmaz ve performans için inanılmaz bir kurtarıcıdır.
Autoloader'ın (spl_autoload_register) Çalışma Mantığı Nedir?
Kodsal olarak örneği aşağıda yer alsada öncesinde çalışma mantığını kavramak çok önemlidir.
Öncelikle spl_autoload_register fonksiyonu bir dosya build edildiği esnada işlemler yapılmadan önce kullanılan tüm class'ların bir listesini çıkartır ve içine tanımlanmış olan fonksiyonu tetikleyerek sahip olduğunuz 100lerce class'dan sadece ilgili olanları yükler ve diğerlerini pas geçer.
Siz sadece 1 defa autload'ı ekledikten sonra inanılmaz fazla include komutundan kurtulursunuz ve bunlar başta size, dosya boyutunun küçülmesi, karmaşıklığın azalması, gereksiz sınıfların yüklenmesi, runtime süresinin kısalması gibi çok sayıda avantaj sağlar.
Autoloader Kod Örneği
Öncelikle aşağıdaki şekilde olan bir proje dizinimiz olsun
./core ----Autoload.php ----Test.php index.php .htaccessŞimdi her bir dosyanın içeriğini size sırasıyla vermiş olayım.
.htaccess dosya içeriği
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]index.php dosya içeriği<?php
require_once(__DIR__ . "/core/Autoload.php");
new Test("deneme");
?>Autload.php dosya içeriği<?php
function my_autoloader($class) {
if (file_exists('core/' . $file . ".php")) {
require_once 'core/' . $class . '.php';
}
}
spl_autoload_register('my_autoloader');
?>Test.php dosya içeriği<?php
class Test
{
public function __construct($str)
{
echo $str;
}
}Dikkat Edilmesi Gerekenler ve SonuçNormalde yukarıdaki kod alanını farkındaysanız çalıştırmak için Test.php dosyasını include etmedik ancak ekranda "deneme" yazısı oluştu.
İşte bu autoloader fonksiyonunun çağrıldığı andan itibaren build işlemi bitene kadarki tüm kodu okuyup, ismi geçen tüm class'ları dizi halinde içinde belirtilen fonksiyona iletmesi sonucu gerçekleşiyor.
İlgili dosyanın içerisindeki spl_autoload_register fonksiyonu my_autoloader fonksiyonuna bu listeyi TEK TEK iletiyor. Her sınıf adı gönderdiğinde ilgili fonksiyonumuz belirttiğimiz dizinde dosya var ise ekliyor.
Dikkat Edilmesi Gerekenler
- Dosya isimlerimiz ile Class isimlerimiz aynı olmalı
- Dosyamız Class olmak zorunda - yani aynı isimde fonksiyon tanımlarsanız bu sistem çalışmaz çünkü spl_autoload_register sayfa adı geçen class nesnelerinden isim toplar ve işler
Büyük projelerdeki gereksiz tonlarca angarya işten kurtulmuş ve ne neredeydi ekledim mi gibi dertlerden kurtulmuş, performanslı ve proje büyürken modüler şekilde olmanın avantajlarına kavuştuk.
Geliştirme Önerileri
- Class isimlerine core_Test.php gibi dosya yolları verilerek yapı geliştirilebilir
- Dizinlerimizi liste oluşturup bir foreach döngüsünde isimleri kullanarak sırası ile kontrol edebilir böylece tüm class'larımızı aynı klasörde istifleme olayından kurtulabiliriz
