SORU
31 AĞUSTOS 2012, Cuma


PHP veya operatör davranışları

9 ** operatör davranışını anlamaya çalışıyorum. Lütfen aşağıdaki örneklere bakın:

$e = false || true;
var_dump($e);

Çıkış beklendiği gibi: bool(true);

$f = false or true;
var_dump($f);

Çıkış beklendiği gibi: bool(false). = $f 17 ** atanır yüzden Or daha yüksek bir önceliğe sahip bir şekilde anladım.

Ama aşağıdaki kodu düşündüğüm oldukça ters çalışır. $foo 5 atanmış sonra bir de kendine göre olacağını düşündüm. Ama $foo yalnızca $foo $foo bir şey daha önce atanmış olup olmadığını denetliyor demektir ayarlanmışsa, 5 atama atanmış oluyor.

$foo or $foo = 5; 

Kimse bunun neden böyle olduğunu açıklayabilir mi?

CEVAP
31 AĞUSTOS 2012, Cuma


Temel:

  1. Bir atama ifadesi atanan değer verir.

    Bu ne anlama geliyor? $foo = 'bar' atama operatörü = bir değer atar bir ifade. Bir ifade, her zaman bir değer kendisi verir. Sadece ifade gibi 1 2 değer 3, $foo = 'bar' değeri sonuçları ifade 'bar' olur. Bu işler neden:

    $foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
    
  2. Boolean işlemleri kısa devre işlemleri. Her iki taraf da, eğer gerek olsaydı zaten her zaman değil değerlendirilir. true || false sol işlenen bütün ifade true olmalı yani 33 ** olduğundan her zaman true genel. false burada bile değerlendirilmektedir.

  3. Operator precedence bir ifadenin parçalarını alt ifadeler şeklinde gruplandırılmış olarak belirler. Yüksek öncelikli operatörler daha düşük öncelikli operatörler önce işlenen gruplandırılır.

Bu nedenle:

$e = false || true;

false || true değeri sonuçları değerlendirilmektedir, $e atanan true,. || operatör =, false || true bu nedenle bir ifade ($e = false) || true (karşıt olarak) halinde gruplandırılmış daha yüksek bir önceliğe sahip.

$f = false or true;

Şimdi burada or vardıraltor önce atama işlemi bir ifade halinde gruplandırılmış olduğu anlamına gelir = daha önceliklidir. İlk $f = false ifadesi sonucu false değerlendirilir (yukarıda). O zaman bir sonraki değerlendirilir ve true, sonuçları ama kimsenin umurunda olan 50* *basit ifade var.

Değerlendirme şu şekilde çalışır:

1. $f = false or true;
2. ($f = false) or true;  // precedence grouping
3. false or true;         // evaluation of left side ($f is now false)
4. true;                  // result

Şimdi:

$foo or $foo = 5; 

Burada,, $foo = 5 daha yüksek bir önceliğe sahip bir ifadesi olarak kabul edilir. or operatörün sağ tarafında olduğundan, ifade gerekirse tek değerlendirilir. $foo başlangıçta ne olduğuna bağlı. $foo true yan true or ($foo = 5) 60 ** genel olması gerektiğinden hiç değerlendirilmesi, olmayacak sağ el. Eğer $foo bir falsey değeri başlangıçta rağmen, sağ el tarafı ve değerlendirilir 5 atanan $foo hangi sonuçları 5, hangisi gerçek gibi, yani genel ifadesi true, kimsenin umurunda değil.

1. $foo or $foo = 5;
2. $foo or ($foo = 5);   // precedence grouping
3. false or ($foo = 5);  // evaluation of left side
4. false or 5;           // evaluation of right side ($foo is now 5)
5. true;                 // result

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Modus Recordings

    Modus Record

    26 Kasım 2008
  • NextGenWindows

    NextGenWindo

    8 Kasım 2011
  • TSE

    TSE

    12 Kasım 2012