• 05-08-2018, 12:34:31
    #1
    <?php
    
    function test($obj) {
      
        $obj->a++;
      
    }
    
    $obj = new stdClass();
    $obj->a = 1;
    
    test($obj);
    
    echo $obj->a;
    Ekran çıktısı olarak 2 çıkıyor. Global olmadığı için 1 olarak göstermesi gerekmiyor mu?
  • 05-08-2018, 12:59:44
    #2
    $obj->a değerini 1 e eşitleyip teste gönderiyorsunuz. Test de de$obj->a++; kısmında bunu 1 artırıyor 2 olması normal

    $obj->a = 1; //1

    test($obj); //2

    echo $obj->a; //2
  • 05-08-2018, 13:01:51
    #3
    function test($obj) {
      
        $obj->a++;
      
    }
    Bu fonksiyonda hangi nesne olursa olsun a attribute nü 1 değer artır diyorsunuz. haliyle 2 olması normal .
  • 05-08-2018, 13:04:38
    #4
    Kurumsal Üye
    $obj->a = 0;
  • 05-08-2018, 13:09:24
    #5
    @mahirtaha; @M_D_5;

    function test($degisken) {
     
        $degisken++;
     
    }
     
    $degisken = 1;
     
    test($degisken);
     
    echo $degisken;
    Object yerine string yapınca, 1 çıkıyor. Fonksiyon içinde global $degisken; yazsaydık 2 çıkacaktı.

    Yani object olunca global tanımlamaya gerek kalmıyor, hep 2 çıkıyor. Aradaki farkı anlayamadım tam olarak.
  • 05-08-2018, 13:38:21
    #6
    soulmy adlı üyeden alıntı: mesajı görüntüle
    @mahirtaha; @M_D_5;

    function test($str) {
     
        $str++;
     
    }
     
    $str = 1;
     
    test($str);
     
    echo $str;
    Object yerine string yapınca, 1 çıkıyor. Fonksiyon içinde global $str; yazsaydık 2 çıkacaktı.

    Yani object olunca global tanımlamaya gerek kalmıyor, hep 2 çıkıyor. Aradaki farkı anlayamadım tam olarak.
    sizin değişken adını $str yapmanız değişkeni string değişkeni yapmaz. String türünde bir değişken oluşturup 1 basmak istiyorsanız $str = 1; şeklinde değil $str = "1"; şeklinde tanımlamanız gerekir.
    Burda anlatmaya calıstıgım obje de olsa değişkende olsa siz 1 e eşitliyip int bir değer veriyorsunuz bunu da test fonksyionunda 1 artırıyorsunuz. 1+1 =2 sonuu veriyor. String şeklinde kullanmak istiyorsanız. $srt = "1"; tırnak ıcınde olmalıdır değişken adlarına gre string yada int olmaz. $double ="5"; dedim diye $double değişkenim double türünde olmuş olmuyor. $double değişkeni bir string şuan için.


    Sonucun hep 2 değil sürekli yükselmesini kastediyoranız siz her program satır satır okumaya basladıgında deger onceden ne olursa olsun 1 eşitliyorsunuz. bir önceki el değer 2 olmul olsa bile aynı değişken tekrar 1 e şitlenip bir eklenıyor. her sayfa yenılemesınde. sürekli artırımlı ilerlemek istiyorsanız şöyle bir kod kullanılabilir.
    function test($str) {
     
        $str++;
     
    }
    session_start();
    if(empty($_SESSION["oturumadi"])){
    $_SESSION["oturumadi"] = 0;
    }
    test($_SESSION["oturumadi"]);
    echo $_SESSION["oturumadi"];
  • 05-08-2018, 13:54:42
    #7
    Doğru doğru, string tabirini yanlış kullandım. Mesajı editledim şimdi.

    Ben tam anlatamadım derdimi. Baştan alalım.

    function test($obj) {
     
        $obj->a++;
     
    }
    
    $obj = new stdClass();
    $obj->a = 1;
    
    test($obj);
    
    echo $obj->a;
    Ekran çıktısı : 2

    function test($degisken) {
     
        $degisken++;
     
    }
     
    $degisken = 1;
     
    test($degisken);
     
    echo $degisken;
    Ekran çıktısı : 1

    Neden farklı sonuç çıkıyor? Onu anlayamadım.
  • 05-08-2018, 19:12:23
    #8
    ztk
    Kimlik doğrulama veya yönetimden onay bekliyor.
    function test($degisken) {

    $degisken++;

    }

    $degisken = 1;

    $degisken = test($degisken);

    echo $degisken;


    yaparsanız 2 sonucunu alırsınız.
  • 06-08-2018, 05:53:52
    #9
    PHP de objeler fonksiyona parametre olarak gönderildiğinde değişkenlerde olduğu gibi "pass by value" değil "pass by reference" olarak gönderilir. $obj değişkeni aslında pointer dır. Fonksiyona değişkenin değerini değil adresini gönderir, böylelikle asıl değişkenin değeri değişmiş olur, fonksiyon içinde yeni bir değişken oluşturulmaz.

    Eğer 2. örnekdeki fonksiyonu "function test(&$degisken)" şeklinde $değişken değişkenini "pass by reference" şeklinde almaya ayarlarsan objedeki gibi sonucu 2 olarak vericektir.

    soulmy adlı üyeden alıntı: mesajı görüntüle
    Doğru doğru, string tabirini yanlış kullandım. Mesajı editledim şimdi.

    Ben tam anlatamadım derdimi. Baştan alalım.

    function test($obj) {
     
        $obj->a++;
     
    }
    
    $obj = new stdClass();
    $obj->a = 1;
    
    test($obj);
    
    echo $obj->a;
    Ekran çıktısı : 2

    function test($degisken) {
     
        $degisken++;
     
    }
     
    $degisken = 1;
     
    test($degisken);
     
    echo $degisken;
    Ekran çıktısı : 1

    Neden farklı sonuç çıkıyor? Onu anlayamadım.