Sınıflar ve Nesneler
PHP Manual

Özdevinimli Sınıf Yükleme

Nesne-yönelimli uygulama yazan birçok geliştirici, her bir sınıf tanımı için ayrı bir PHP kaynak dosyası oluşturmaktadır. Bu kullanımın en can sıkıcı noktalarından bir tanesi, betiklerin en tepesinde bir sürü dosyanın betiğe dahil edilmesini gerektirmesidir (her bir sınıf için ayrı bir dosya).

PHP 5 ile birlikte bu durum zorunluluk olmaktan çıkmıştır. Henüz tanımlanmamış bir sınıfı özdevinimli olarak çağırmak istediğinizde, bir __autoload işlevi tanımlayabilirsiniz. Bu işlevi çağırmakla PHP'nin çalışması hata ile sonuçlanmadan önce betik yorumlama motoruna sınıfı yüklemek için son bir şans verilmiş olur.

Bilginize:

5.3.0 öncesinde, __autoload işlevinde oluşan istisnalar catch bloğu ile yakalanamaz, dolayısıyla ölümcül hata ile sonuçlanır. 5.3.0 ve sonrasında ise, bir tane olması şartıyla yakalanabilir. Özel bir istisna yakalanacaksa özel istisna sınıfı mevcut olmalıdır. __autoload işlevi özel istisna sınıflarını ardışık (iç içe) olarak yüklemek için kullanılabilir.

Bilginize:

PHP CLI'yi etkileşimli kipte kullanıyorsanız özdevinimli yükleme kullanılamayacaktır.

Bilginize:

Sınıf ismini call_user_func() gibi bir işlevde kullanırsanız ../ gibi bazı tehlikeli karakterler içerebilir. Böyle işlevlerde kullanıcı girdilerini kullanmamanız ya da en azından girdiyi __autoload() ile doğrulamanızı öneririz.

Örnek 1 - Özdevinimli yükleme örneği

Bu örnek MyClass1 ve MyClass2 sınıflarını yüklemeye çalışmaktadır. Sınıflar aynı isimli MyClass1.php ve MyClass2.php dosyalarının içinde yer almaktadırlar.

<?php
function __autoload($class_name) {
    require_once 
$class_name '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2();
?>

Örnek 2 - Başka bir özdevinimli yükleme örneği

Bu örnek DenemeA arayüzünü yüklemeye çalışır.

<?php

function __autoload($isim) {
    
var_dump($isim);
}

class 
Fan implements DenemeA {
}

/*
string(5) "DenemeA"

Fatal error: Interface 'DenemeA' not found in ...
*/
?>

Örnek 3 - 5.3.0 ve sonrasında istisnalı özdevinimli yükleme

Bu örnekte bir istisna yakalanmakta ve try/catch kullanımı gösterilmektedir.

<?php
function __autoload($name) {
    echo 
"$name yüklenmek isteniyor.\n";
    throw new 
Exception("$name yüklenemedi.");
}

try {
    
$obj = new YüklenemezSınıf();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

Yukarıdaki örneğin çıktısı:

YüklenemezSınıf yüklenmek isteniyor.
YüklenemezSınıf yüklenemedi.

Örnek 4 Autoloading with exception handling for 5.3.0+ - Missing custom exception

This example throws an exception for a non-loadable, custom exception.

<?php
function __autoload($name) {
    echo 
"Want to load $name.\n";
    throw new 
MissingException("Unable to load $name.");
}

try {
    
$obj = new NonLoadableClass();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

Yukarıdaki örneğin çıktısı:

Want to load NonLoadableClass.
Want to load MissingException.

Fatal error: Class 'MissingException' not found in testMissingException.php on line 4

Ayrıca Bakınız


Sınıflar ve Nesneler
PHP Manual