Gönderimleri kullanıldığı üç temel işlem vardır: gönderimli atama, gönderimli aktarma, ve gönderimli döndürme. Bu bölümde bu işlemlerle ilgili bağlantılar verilerek bir başlangıç yapılmıştır.
Bu ilk temel işlemde, iki değişkenin aynı içeriğe atıf yapmasına izin verilir. Örnek:
<?php
$a =& $b;
?>
Bilginize:
Burada $a ve $b tamamen eşittir; ne $a, $b'yi göstermekte ne de $b, $a'yı göstermektedir; $a ve $b aynı yeri göstermektedir.
Bilginize:
Eğer tanımlanmamış bir değişken gönderimle atanır, aktarılır veya döndürülürse oluşturulmuş olur.
Örnek 1 - Gönderimlerin tanımlanmamış değişkenlerle kullanımı
<?php
function foo(&$var) { }
foo($a); // $a "oluşturulur" ve değer olarak null atanır
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new stdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
Aynı sözdizimi, gönderim döndüren işlevler ile kullanılabilir:
<?php
$foo =& dğşkn_bul($bar);
?>
Aynı sözdizimini gönderimle dönmeyen bir işlevle kullanmak, işlevin new işlecinin sonucuyla kullanımına benzer bir hata verecektir. Nesneler göstericilerle aktarılsa da bunlar, Nesneler ve Gönderimler. altında açıklanan gönderimlerle aynı değildir.
Bir işlevin içinde global
olarak bildirilmiş bir değişkeni gönderimli olarak atarsanız gönderim sadece işlevin içinde görünür olur. $GLOBALS dizisini kullanarak bundan kaçınabilirsiniz.
Örnek 2 - İşlev içinde küresel değişkenlere gönderim
<?php
$var1 = "Örnek değişken";
$var2 = "";
function küresel_gönderimler($küreselleri_kullan)
{
global $var1, $var2;
if (!$küreselleri_kullan) {
$var2 =& $var1; // sadece işlev içinde görünürdür
} else {
$GLOBALS["var2"] =& $var1; // küresel alanda da görünürdür
}
}
küresel_gönderimler(false);
echo "var2'ye '$var2' atanır\n"; // var2'ye '' atanır
küresel_gönderimler(true);
echo "var2'ye '$var2' atanır\n"; // var2'ye 'Örnek değişken' atanır
?>
global $var;
deyimi $var =& $GLOBALS['var'];
deyimine bir kısayol olarak düşünülür. Bu bakımdan $var
'a başka bir gönderim atamak sadece yerel değişkenin gönderimini değiştirir. Bilginize:
Eğer bir değişkene foreach döngüsü içinde gönderimle bir değer atarsanız gönderimde de değişiklik yapılmış olur.
Örnek 3 - foreach döngüsü içinde gönderim
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// işlemler
}
echo $ref; // 3 - yinelenen dizinin son elemanı
?>
Tam olarak gönderime göre atama olmamakla birlikte, array()
dil oluşumu ile oluşturulan ifadeler, eklenecek dizi öğesi &
ile öncelenerek öyleymiş gibi davranabilir. Örnek:
<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
?>
Bununla birlikte, dizilerdeki gönderimlerin potansiyel olarak tehlikeli olduğunu unutmayın. Bir ifadenin sağ tarafında yapılan bir gönderimli (gönderime göre değil) atama yapılması sol tarafı bir gönderim haline getirmez, fakat dizilerin içinde bu normal atamalar korunur. Bu ayrıca, dizilerin değerleriyle aktarıldığı işlev çağrılarında da uygulanır. Örnek:
<?php
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c bir gönderim değildir; $a veya $b değişmez
$arr = array(1);
$a =& $arr[0]; //$a ve $arr[0] aynı gönderim kümesindedir
$arr2 = $arr; //gönderime göre atama dğildir!
$arr2[0]++;
?>
Gönderimlerle yapılan ikinci şey değişkenleri gönderimle aktarmaktır. Bir işlev içinde bir yerel değişken oluşturup çağrı etki alanında bir değişkenle aynı içeriğe gönderim yaparak bu gerçeklenebilir. Örnek:
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
echo $a; // 6 çıktılar
?>
Gönderimlerle yapılan üçüncü şey gönderimli değer döndürmedir.