Passing by Reference (&$) kullanım örnekleri?
Dök. link: https://www.php.net/manual/en/language.references.pass.php
function (&$param1) { ..... }
şeklinde kullanımlarla karşılaştım ancak bunu özellikle kullanım amacı nedir? Ne amaçla kullanılır tam olarak?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (2)
Ben de daha evvel kullandığım iki şekli ile örnek vereyim, mantık aynı tabii de örnek çeşitliliği açısından.
Bir diziyi döngüye soktuğumuzda başka bir array daha oluşturmadan içindeki değerleri direkt olarak değiştirebilmek için foreach gibi döngülerde kullanabilirsin;
$array = ['item 1', 'item 2', 'item 3', 'item 4', 'item 5'];
foreach ($array as $index => &$item) {
$item = "item $index";
}
print_r($array);
// Array
// (
// [0] => item 0
// [1] => item 1
// [2] => item 2
// [3] => item 3
// [4] => item 4
// )
Ya da belki bazen recursive bir anonim fonkiyon yazmak istersin, fonksiyonun döndürdüğü değeri yine aynı fonksiyonda kullanmak istersin;
$func = function ($param) use (&$func) {
$return = $param * 3;
if ($return < 50)
return $func($return);
return $return;
};
echo $func(2);
// 54
Örnekler biraz garip olabilir ama aklıma ilk gelen şeyi yaptım :)
yani şöyle düşün, fonksiyonda parametre olarak geçtiğin elemanı değiştirmek istiyorsan ama onu geriye döndürmek yerine değerinin direk etkilenmesini istiyorsan kullanabilirsin, sonuçta fonksiyonun sadece onunla ilgili bir işlemi olmayabilir, ya da aldığın parametreye göre fonksiyon farklı bir işlem için değer döndürebilir ama alınan parametreninde bundan etkilenilmesi istenebilir.
kısaca referans aldığın değişkenin değerini etkiliyor bu şekilde kullanırsan, en basit örneği;
<?php
$text = 'hello';
function changeText(&$text) {
$text .= ' world';
}
changeText($text);
echo $text; // hello world
başka bir örnek
<?php
$numbers = [2, 3, 5];
function multiply(&$nums) {
$nums = array_reduce($nums, function($prev, $num) {
$prev[] = $num * 2;
return $prev;
}, []);
}
multiply($numbers);
print_r($numbers);
/*
Array
(
[0] => 4
[1] => 6
[2] => 10
)
*/
tabi bu olay sadece parametre geçmekle alakalı değil, örneğin şöyle kullanımlarıda var;
$text1 = 'hello';
$text2 = &$text1;
$text2 = 'deneme';
echo $text1;
$text2
oluşturulurken $text1
referansıyla oluşturuluyor, dolayısı ile $text2
değiştirince aslında referansı yani $text1
değişiyor. Bu tarz kullanımlara çok takılma, vakti gelirse zaten ihtiyacın olduğu bir noktada mutlaka kullanırsın :)