Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

Php de bellekte tutulan değişkenler hakkında

Php de static değişkenler ve bellekteki adreslerini alma konusunda kafamda bazı sorular var.
Önemli bir konu olduğunu düşündüğüm için sizlere danışmak istedim.

Anladığım ve anlamadığım noktalarını sizlere aktarmak istiyorum. Önemli bir konu olduğunu düşünüyorum onun için bu soruyu sormakta fayda görüyorum.
$degisken1 = 'degisken1';

//Şimdi $degisken1 ' in bellekteki adresine işaret ediyoruz.
//Yani $degisken1 değişirse $_degisken1 de değişecek.
//Aynı şekilde tam tersi de olacak
$_degisken1 =& $degisken1;

function statik_degisken_denemesi($deger)
{
	/*$_static daha önce bellekte tanımlanmamışsa yeni oluşturulur eğer tanımlanmışsa bellekteki  $_statik değişkeninin adresine işaret eder*/
	static $_statik;
	
	if(isset($_statik[$deger]))
	{
		echo 'zaten eklenmiş';
		return $_statik[$deger];;
	}
	
	if(!isset($_statik[$deger]))
	{
		$_statik[$deger] = $deger;
		echo 'yeni eklendi';
		return $_statik[$deger];
	}
}
$s1 = statik_degisken_denemesi('deger1'); //çıktı : yeni eklendi
$s2 = statik_degisken_denemesi('deger2'); //çıktı : yeni eklendi
$s3 = statik_degisken_denemesi('deger1'); //çıktı : zaten eklenmiş

Buraya kadar sorun yok. Şimdi takıldığım noktaya geldik.

Bazı yerlerde şöyle kullanımlar var.
$s1 =& statik_degisken_denemesi('deger3'); //çıktı : yeni eklendi
$s2 =& statik_degisken_denemesi('deger4'); //çıktı : yeni eklendi
$s3 =& statik_degisken_denemesi('deger2'); //çıktı : zaten eklenmiş 
?>

=& buradaki '&' karakterinin neden kullanıldığını bir türlü anlamış değilim.

Ayrıca birde fonksiyon tanımlanırken şu şekilde fonksiyon isminin başına '&' karakteri konuyor. bunu da anlamış değilim
function &statik_degisken_denemesi($deger)
{
	//fonksiyon içeriği
}


Biraz tecrübe gerektiren konular galiba. Anlamadığım noktalar için tecrübeli arkadaşlardan yardım bekliyorum.
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Doğru Cevap

  • tutkun adlı üyenin fotoğrafı
    9 yıl önce yazılmış
    11 cevap - 0 soru
    $degisken =& fonksiyon();

    şeklindeki ifade; fonksiyon() adlı fonksiyonun döndürdüğü "kopya" değeri değil, fonksiyon içinde oluşturulan değişkenin değerini işaret eder.
    yani:
    $degisken = Null;
    function fonksiyon( $deger ){
       global $degisken;
       return ( $degisken = $deger );
    }
    
    $bos_deger =& fonksiyon( Null );
    echo '<br>$degisken\'in değeri: ' . $degisken;
    
    $dolu_deger =& fonksiyon( "deneme" );
    echo '<br>$degisken\'in fonksiyon("deneme") atamasından sonraki değeri: ' . $degisken;
    echo '$dolu_deger\'in değeri: '. $dolu_deger;
    echo '$bos_deger\'in değeri: '. $bos_deger;
    
    • Alexander adlı üyenin fotoğrafı Alexander
      sorumun birinin cevabını aldım çok teşekkür ederim.

      şimdi function &fonksiyon_adi(){ ...} buradaki & karakterinin ne işe yaradığı kaldı.
      9 yıl önce yazılmış
    • tutkun adlı üyenin fotoğrafı tutkun
      ikisi aynı şey.
      yani fonksiyonu her kullanışta buraya "=& fonksiyon( ... );" diye yazmak yerine fonksiyonu tanımlarken "function &fonksiyon( ... ) { ... }" şeklinde tanımlıyorsun. bu sayede bu fonksiyon doğuştan değerin kopyası yerine bellekteki adresi gönderiyor ;)
      9 yıl önce yazılmış
    • Alexander adlı üyenin fotoğrafı Alexander
      çok teşekkür ederim utku kafamdaki soru işaretlerini kaldırmış oldum senin sayende
      9 yıl önce yazılmış

Cevaplar

  • codermuci adlı üyenin fotoğrafı
    9 yıl önce yazılmış
    6 cevap - 3 soru
    =& bu operatörü ilk defa gördüm ve deneme gereği duydum ama gördüm ki kullanılsa da kullanılmasa da herhangi bir değişiklik olmuyor.İyi günler hocam.
    • Alexander adlı üyenin fotoğrafı Alexander
      aynen bende de o şekilde . Bende bunu merak ediyordum . Çünkü bu kullanımları codeigniter framework kodlarında kullanılmış
      9 yıl önce yazılmış
    • tutkun adlı üyenin fotoğrafı tutkun
      Olur mu yaa! :)

      Bunun kullanılması bellekte var olan işlemin tekrarını önlemek.
      Yani şunun gibi bir şey:

      Bir kek yapmak için, bir bardağı kalıp olarak kullanıyoruz diyelim.
      Her seferinde raftan aynı özelliklere sahip bir bardak alıp, masanın üzerine bırakmak(kirletmek) mi,
      yoksa bir bardak alıp, tüm işlemi onunla idame etmek mi mantıklı? :)

      Biraz enteresan örnek oldu; ama idare edin :))
      9 yıl önce yazılmış
    • Alexander adlı üyenin fotoğrafı Alexander
      Peki fonksiyonu şu şekilde tanımladığım zaman =& şeklinde atama yapmama gerek varmı?

      function &ref_donder()
      {
      	$ref = 'deneme';
      	return $ref;
      }
      


      Araştırdığıma göre fonksiyon bu şekilde tanımlanırsa $a = ref_donder() ile $a =& ref_donder() arasında fark kalmıyor.

      Doğrumudur ?
      9 yıl önce yazılmış
    • tutkun adlı üyenin fotoğrafı tutkun
      En iyisi şöyle anlatayım:

      =& işareti, aslında referans demektir; malum...

      class Referans {
         
         public $ali, $veli;
      
         public function Ali() {
            $this->veli = "Ali";  // Ali artık $this->veli'nin değeri...
         }
       
         public function VeliyiReferansAl() {
            $this->ali =& $this->veli; // $this->ali artık $this->veli'nin değerini işaret ediyor(referans gstryor).
         }
      }
      
      $referans = new Referans(); // sınıfı tanımladık
      
      $referans->Ali(); // veli'ye değer atadık
      echo $referans->veli . "<br>";
      
      $referans->VeliyiReferansAl(); // ali, veli'nin değerini kullanacak(referans alacak)
      echo $this->ali  . "<br>";
      
      // şimdi bakalım $this->ali'yi değiştirirsek ne olacak...
      $this->ali = "Ben Ali'yim, ama burası Veli'nin mekanı!";
      echo $this->ali . "<br>";
      echo $this->veli . "<br>";
      
      
      
      9 yıl önce yazılmış
    • tutkun adlı üyenin fotoğrafı tutkun
      evet, fonksiyon içinde sabit değer atanıyor. bu yüzden ikisi arasında fark yok. zaten fonksiyon duşına çıkınca $ref yok olacak.
      9 yıl önce yazılmış