PHP/Değişkenlerde Gönderimli Atama

Vikikitap, özgür kütüphane
< PHP
Gezinti kısmına atla Arama kısmına atla

Değişkenlerin değerleri birbirlerine aktarılabilir. Değişkenlerin değerleri birbirlerine aktarıldığında, daha sonra o değişkenlerin değerlerinde yapılan değişiklikler diğerini etkilemez:

1 <?php
2 $char1 = "a";
3 $char2 = "b";
4 $char1 = $char2; // $char1'in değeri "b" oldu
5 $char2 = "c"; // $char2 "c" oldu, $char1 hala "b"
6 
7 // teyit etmek için var_dump() kullanalım
8 var_dump($char1, $char2); // çıktısı: string(1) "b" string(1) "c"
9 ?>

Burada "a" değerli $char1 ve "b" değerli $char2 isimli iki değişken tanımlandı. 4. satırda $char1 ve $char2 değişkenlerinin değerleri eşitleniyor. 5. satırda $char2 değişkenine "c" değeri veriliyor. Bu durumda $char2 değişkeni "c" değerini gösterirken $char1 değişkeni hala "b" değerini göstermektedir. Bunun nedeni $char1 ve $char2 değişkenlerinin bellekte farklı yeri göstermeleridir.

Eğer istenen şey iki değişkenin de bellekte aynı yeri göstermesi, yani birinde yapılan bir değişikliğin diğerini de etkilemesi ise o zaman gönderimli atamadan yararlanılır. Yine yukarıdaki betiği kullanalım:

<?php
$char1 = "a";
$char2 = "b";
$char1 =& $char2; // $char1'in değeri "b" oldu
$char2 = "c"; // $char2 "c" oldu, $char1 de "c" oldu

// teyit etmek için var_dump() kullanalım
var_dump($char1, $char2); // çıktısı: string(1) "c" string(1) "c"
?>

Görüldüğü gibi $char2 değişkeninde yapılan değişiklik $char1 değişkenini de etkiledi. Gönderim yapılırken atama işleminin = ile değil =& ile yapıldığına dikkat ediniz.

Gönderimi ortadan kaldırmak için unset() işlevi kullanılır.

 1 <?php
 2 $char1 = "a";
 3 $char2 = "b";
 4 $char1 =& $char2; // $char1'in değeri "b" oldu
 5 $char2 = "c"; // $char2 "c" oldu, $char1 de "c" oldu
 6 
 7 var_dump($char1, $char2); // çıktısı: string(1) "c" string(1) "c"
 8 
 9 unset($char2); // gönderim tanımsız oldu. $char2 de tanımsız oldu
10 
11 var_dump($char2); // NULL
12 ?>

Burada 4. satırda gönderimli atama yapılıyor. 7. satırda ise gönderimli atamaya tabi değişkenlerden char2, unset() ile tanımsız kılınıyor ve böylece gönderim de tanımsız oluyor. Yani gönderimli atamayı ortadan kaldırmanın tek yolu, değişkenlerden birini tanımsız kılmaktır.