Sınıflar ve Nesneler (PHP 5)
PHP Manual

Aşırı Yükleme

PHP'deki aşırı yükleme, bir sınıfın üyelerini ve yöntemlerini devingen olarak "oluşturmak" anlamına gelmektedir. Bu devingen öğeler, çeşitli eylem türleri için sınıf içinde oluşturulabilen sihirli yöntemler üzerinden işleme sokulurlar.

Aşırı yükleme yöntemleri, henüz bildirilmemiş veya geçerli etki alanında görünür olmayan üyeler ve yöntemlerle etkileşilmek istendiğinde çağrılırlar. Bu bölümün kalanında bu bildirim ve görünürlükle ilgili durumdan bahsederken "erişilemeyen üyeler" ve "erişilemeyen yöntemler" terimlerini kullanacağız.

Tüm aşırı yükleme yöntemlerinin public olarak tanımlanması gerekir.

Bu sihirli yöntemlerin değiştirgelerinin hiçbiri gönderimli olarak aktarılamaz.

Bilginize: PHP'nin "aşırı yükleme" konusundaki yorumu çoğu nesne yönelimli dilden farklıdır. Aşırı yükleme geleneksel olarak, dile, farklı miktar ve türde değiştirgeye sahip aynı isimde çok sayıda yönteme sahip olabilme yeteneği sağlar.

Sürüm Bilgisi

Sürüm: Açıklama
5.3.0 __callStatic() eklendi. Genel etki alanında görünürlüğü ve devingen bildirimini zorunlu kılacak uyarı eklendi.
5.1.0 __isset() ve __unset() eklendi.

Üyelerde aşırı yükleme

void __set ( string $isim , mixed $değer )
mixed __get ( string $isim )
bool __isset ( string $isim )
void __unset ( string $isim )

__set() erişilemeyen üyelere veri yazarken çalıştırılır.

__get() erişilemeyen üyelerden veri okurken devreye sokulur.

__isset() erişilemeyen üyeler için isset() veya empty() çağrıldığında tetiklenir.

__unset() erişilemeyen üyeler için unset() kullanıldığında çağrılır.

$isim değiştirgesi etkileşime girilecek üyenin ismidir. __set() yönteminin $değer değiştirgesi, $isim adlı üyeye atanacak değeri belirler.

Üyeler üzerindeki aşırı yükleme sadece nesne bağlamında çalışır. Bu sihirli yöntemler duruk bağlamda tetiklenmeyecektir. Bu bakımdan, bu yöntemler static bildirilemez.

Örnek 1 - __get, __set, __isset ve __unset ile aşırı yükleme örneği

<?php
class ÜyeSınama {
    
/**  Aşırı yüklemeye konu veriler burada.  */
    
private $veri = array();

    
/**  Bildirilmiş üyeler için aşırı yükleme kullanılmaz.  */
    
public $bildirilmiş 1;

    
/**  Aşırı yükleme sadece sınıf dışından erişilemeyen üyeler içindir.  */
    
private $gizli 2;

    public function 
__set($isim$değer) {
        echo 
"'$isim' adlı üyeye '$değer' atanıyor.\n";
        
$this->veri[$isim] = $değer;
    }

    public function 
__get($isim) {
        echo 
"'$isim' adlı üyenin değeri isteniyor\n";
        if (
array_key_exists($isim$this->veri)) {
            return 
$this->veri[$isim];
        }

        
$trace debug_backtrace();
        
trigger_error(
            
$trace[0]['file'] . ' dosyasının ' .
            
$trace[0]['line'] . '. satırında ' .
            
'__get() ile tanımsız özellik istendi: ' $isim,
            
E_USER_NOTICE);
        return 
null;
    }

    
/**  PHP 5.1.0'dan itibaren  */
    
public function __isset($isim) {
        echo 
"'$isim' atanmış mı?\n";
        return isset(
$this->veri[$isim]);
    }

    
/**  PHP 5.1.0'dan itibaren  */
    
public function __unset($isim) {
        echo 
"'$name' siliniyor\n";
        unset(
$this->veri[$isim]);
    }

    
/**  Sihirli bir yöntem değil; sadece örnek olsun diye.  */
    
public function gizliyiOku() {
        return 
$this->gizli;
    }
}


echo 
"<pre>\n";

$obj = new ÜyeSınama;

$obj->1;
echo 
$obj->"\n\n";

var_dump(isset($obj->a));
unset(
$obj->a);
var_dump(isset($obj->a));
echo 
"\n";

echo 
$obj->bildirilmiş "\n\n";

echo 
"'gizli' isimli 'private' özellik ile bir deneme yapalım:\n";
echo 
"'private' özellikler sadece sınıf içinde görünürdürler,\n";
echo 
"bu yüzden __get() kullanılmaz...\n";
echo 
$obj->gizliyiOku() . "\n";
echo 
"'private' özellikler sınıf dışında görünür değildirler,\n";
echo 
"dolayısıyla __get() kullanılır...\n";
echo 
$obj->gizli "\n";
?>

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

'a' adlı üyeye '1' atanıyor.
'a' adlı üyenin değeri isteniyor
1

'a' atanmış mı?
bool(true)
'' siliniyor
'a' atanmış mı?
bool(false)

1

'gizli' isimli 'private' özellik ile bir deneme yapalım:
'private' özellikler sadece sınıf içinde görünürdürler,
bu yüzden __get() kullanılmaz...
2
'private' özellikler sınıf dışında görünür değildirler,
dolayısıyla __get() kullanılır...
'gizli' adlı üyenin değeri isteniyor

Notice: <dosya> dosyasının 71. satırında __get() ile tanımsız özellik istendi: gizli

Yöntemlerde aşırı yükleme

mixed __call ( string $isim , array $değiştirgeler )
mixed __callStatic ( string $isim , array $değiştirgeler )

__call(), erişilemeyen yöntemler bir nesne bağlamından çağrıldığında tetiklenir.

__callStatic(), erişilemeyen yöntemler duruk bir bağlamdan çağrıldığında tetiklenir.

$isim değiştirgesi çağrılan yöntemin ismidir. $değiştirgeler değiştirgesi ise $isim adlı yönteme aktarılan değiştirgeleri içeren numararalı bir dizidir.

Örnek 2 - __call ve __callStatic ile aşırı yüklü örneklenmiş yöntemler

<?php
class YöntemSınama {
    public function 
__call($isim$değiştirgeler) {
        
// Bilgi: $isim değeri büyük-küçük harfe duyarlıdır.
        
echo "Nesnenin '$isim' yöntemi çağrılıyor: "
             
implode(', '$değiştirgeler). "\n";
    }

    
/**  PHP 5.3.0 ve sonrası  */
    
public static function __callStatic($isim$değiştirgeler) {
        
// Bilgi: $isim değeri büyük-küçük harfe duyarlıdır.
        
echo "Duruk yöntem '$isim' çağrılıyor: "
             
implode(', '$değiştirgeler). "\n";
    }
}

$obj = new YöntemSınama;
$obj->deneBakalım('nesne bağlamında');

YöntemSınama::deneBakalım('duruk bağlamda');  // PHP 5.3.0 ve sonrası
?>

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

Nesnenin 'deneBakalım' yöntemi çağrılıyor: nesne bağlamında
Duruk yöntem 'deneBakalım' çağrılıyor: duruk bağlamda

Sınıflar ve Nesneler (PHP 5)
PHP Manual