array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'tr', ), 'this' => array ( 0 => 'language.oop5.overloading.php', 1 => 'Aşırı Yükleme', ), 'up' => array ( 0 => 'language.oop5.php', 1 => 'Sınıflar ve Nesneler', ), 'prev' => array ( 0 => 'language.oop5.anonymous.php', 1 => 'Anonim Sınıflar', ), 'next' => array ( 0 => 'language.oop5.iterations.php', 1 => 'Nesne Yineleme', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'tr', 'path' => 'language/oop5/overloading.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
PHP'deki aşırı yükleme, bir sınıfın özelliklerini ve yöntemlerini dinamik
olarak oluşturmak
anlamına gelmektedir. Bu dinamik öğ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 özellik 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 özellikler
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 bağımsız değişkenlerinin hiçbiri gönderimli olarak aktarılamaz.
Bilginize:
PHP'nin
aşırı yüklemekonusundaki yorumu çoğu nesne yönelimli dilden farklıdır. Aşırı yükleme geleneksel olarak, dile, farklı miktar ve türde bağımsız değişkene sahip aynı isimde çok sayıda yönteme sahip olabilme yeteneği sağlar.
__set() erişilemeyen (protected veya private) veya varolmayan özelliklere veri yazarken çalıştırılır.
__get() erişilemeyen (protected veya private) veya varolmayan özelliklerden veri okurken devreye sokulur.
__isset() erişilemeyen (protected veya private) veya varolmayan özellikler için isset() veya empty() çağrıldığında tetiklenir.
__unset() erişilemeyen (protected veya private) veya varolmayan özellikler için unset() kullanıldığında çağrılır.
$isim bağımsız değişkeni etkileşime girilecek özelliğin ismidir. __set() yönteminin $değer bağımsız değişkeni, $isim adlı özelliğe atanacak değeri belirler.
Özellikler üzerindeki aşırı yükleme sadece nesne bağlamında çalışır. Bu sihirli yöntemler statik bağlamda tetiklenmeyecektir. Bu bakımdan, bu yöntemler static bildirilmemelidir. Sihirli aşırı yükleme yöntemleri static bildirilirse bir uyarı çıktılar.
Bilginize:
PHP'nin atama işlecini ele alış yönteminden dolayı __set() yönteminin dönüş değeri yoksayılır. Benzer şekilde,
örneğindeki gibi zincirleme atamalarda __get() asla çağrılmaz.
$a = $obj->b = 8;
Bilginize:
PHP aşırı yüklü bir yöntemi aynı aşırı yüklü yöntemin içinden çağırmaz. Yani, __get() içinde
return $this->foo
yazılırsanull
dönecek ve __get() işlevini ikinci kez çağırmak yerinefoo
diye bir özellik tanımlı olmadığından birE_WARNING
tetiklenecektir. Ancak, aşırı yüklü yöntemler örtük olarak başka aşırı yüklü yöntemleri çağırabilir (__set()'i tetikleyen __get() gibi).
Örnek 1 - __get(), __set(), __isset() ve __unset() ile aşırı yükleme örneği
<?php
class ÖzellikSınama
{
/* Aşırı yüklemeye konu veriler burada. */
private $veri = array();
/* Bildirilmiş özellikler için aşırı yükleme kullanılmaz. */
public $bildirilmiş = 1;
/* Aşırı yükleme sadece sınıf dışından erişilemeyen özellikler içindir.
*/
private $gizli = 2;
public function __set($isim, $değer)
{
echo "'$isim' adlı özelliğe '$değer' atanıyor.\n";
$this->veri[$isim] = $değer;
}
public function __get($isim)
{
echo "'$isim' adlı özelliğin 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 ÖzellikSınama;
$obj->a = 1;
echo $obj->a . "\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ı özelliğe '1' atanıyor. 'a' adlı özelliğin 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ı özelliğin değeri isteniyor Notice: <dosya> dosyasının 71. satırında __get() ile tanımsız özellik istendi: gizli
__call(), erişilemeyen yöntemler bir nesne bağlamından çağrıldığında tetiklenir.
__callStatic(), erişilemeyen yöntemler statik bir bağlamdan çağrıldığında tetiklenir.
$isim bağımsız değişkeni çağrılan yöntemin ismidir. $bağımsız_değişkenler bağımsız değişkeni ise $isim adlı yönteme aktarılan bağımsız değişkenleri 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, $bağımsız_değişkenler)
{
// Bilgi: $isim değeri büyük-küçük harfe duyarlıdır.
echo "Nesnenin '$isim' yöntemi çağrılıyor: "
. implode(', ', $bağımsız_değişkenler). "\n";
}
public static function __callStatic($isim, $bağımsız_değişkenler)
{
// Bilgi: $isim değeri büyük-küçük harfe duyarlıdır.
echo "Statik yöntem '$isim' çağrılıyor: "
. implode(', ', $bağımsız_değişkenler). "\n";
}
}
$obj = new YöntemSınama;
$obj->deneBakalım('nesne bağlamında');
YöntemSınama::deneBakalım('statik bağlamda');
?>
Yukarıdaki örneğin çıktısı:
Nesnenin 'deneBakalım' yöntemi çağrılıyor: nesne bağlamında Statik yöntem 'deneBakalım' çağrılıyor: statik bağlamda