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);
?>
E_DEPRECATED
ve öncesinde
E_STRICT
seviyesinde ileti üretmektedir.
PHP 7.0 itibariyle sözdizimsel olarak geçersizdir.
(Teknik olrarak, PHP5'teki fark, nesne değişkenleri, özkaynaklara çok benzer,
gerçek nesne verisinin salt bir göstergesidir, bu nedenle bu nesne
gönderimleri, evvelce aynı anlamda kullanılan "gönderimler" 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
?>
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]++;
/* $a == 2, $b == array(3, 4); */
?>
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
/* Sayısal değikenlerin atanması */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c bir gönderim değildir; $a veya $b değişmez
/* Dizi değişkenlerinin atanması */
$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]++;
/* $a == 2, $arr == array(2) */
/* Bir gönderim olmasa bile, $arr'ın içeriği değişti!! */
?>
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.