Gönderimli atama
Bu ilk temel işlemde, iki değişkenin aynı içeriğe atıf yapmasına izin
verilir. Örnek:
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:
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.
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(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:
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:
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:
$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.