Gönderim Ne Yapar?

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.

Gönderimli atama

Bu ilk temel işlemde, iki değişkenin aynı içeriğe atıf yapmasına izin verilir. Örnek:

<?php
$a 
=& $b;
?>
Bunun anlamı, $a ve $b değişkenlerinin aynı içeriği gösterdiğidir.

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);
?>
PHP 5'ten beri, new özdevinimli olarak gönderim döndürmekte, bu bakımdan böyle bir bağlamda =& kullanımı önerilmemekte ve kullanıldığında PHP 5.3 ve sonrasında 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.)

Uyarı

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(
123) 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(23);
$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!! */
?>
Başka bir deyişle, dizilerin gönderim davranışı her eleman için ayrı tanımlanır; elemanların tek tek gönderim davranışı dizi taşıyıcısının gönderim durumundan bağımsızdır.

Gönderimli aktarım

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
?>
$a'nın 6 olmasının sebebi foo işlevinde $var değişkeninin $a'nın içeriğine gönderimli olmasıdır. Daha ayrıntılı açıklamayı gönderimle aktarım bölümünde bulabilirsiniz.

Gönderimli değer döndürme

Gönderimlerle yapılan üçüncü şey gönderimli değer döndürmedir.