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