Neden bu işi yapar: if (isset ($ var) && $ var) {

8 Cevap

Ben tanımlanmış henüz bir $ var değişkeninin var diyelim. Neden bu deyimi hataları alamadım:

if ( isset($var) && $var ){
    // something
} else {
    // do something else
}

Nasıl henüz kurulu değilse, bir şey "&& $ var" doğru olup olmadığını kontrol edebilirsiniz? Isset mı () ise ifadesi için bir şeyler yapmak. Elbette bu dönmelidir:

Notice: Undefined variable:$var

8 Cevap

Deyimi başarısız olursa ilk bölümü, gerisi değerlendirilmez olduğunda, tüm deyimi beri doğru olamaz. isset parçasıdır yalnızca doğruysa, yürütme senin $ var deyimini ulaşıyor.

Bu standart bir dil özelliğidir ve çoğu programlama dilleri yaygındır.

Bu "Kısa Devre Değerlendirme" denir, ve burada Wikipedia'da bu konuda daha fazla bilgi edinebilirsiniz: http://en.wikipedia.org/wiki/Short-circuit%5Fevaluation

Bu çünkü bulunuyor short-circuit evaluation.

&& operatör için ilk parametreleri ikinci parametreyi değerlendirmek için gerek yoktur yanlış ise anlamına gelir.

Bunun nedeni zaman isset() döner false, deyimi değerlendirilir değilse geri kalanı. Kodunuz çalışır böylece eğer deyim 2 kısım girilir hangi sırasıdır. Bunu gibi eğer deyimi etrafında dönüyor denedim:

if ($var && isset($var))
{
  // something
}

Bu başarısız gerekir.

&& Bir short-circuit operatörüdür. Bu ifadenin ilk yarım false döndürürse ifade kalanı işlenecek anlamına gelir. Bu nedenle, $ var tanımlanmış ya değilse görmek için süreç asla değildir.

Diğer zaten && operatörü tembel olduğuna dikkat çekmişlerdir. Ama bu soruya bir başka nokta var:

Değişken PHP tanımlı değilse, tercüman bu değeri vardı sanki, değerlendirir null. PHP gerçekten umurumda değil. null kendisi boolean false olarak ele alınır gibi, yukarıda geçerli (boolean) ifadesi olur.

<?php

  if( $var ) {
     echo "something";
  } else {
     echo "nothing";
  }

Bir istisna yükseltmek, ama $var tanımlı değilse, sadece nothing echo olmaz.

&& Operatör kısa devre olduğunu. Bu bir yanlış varsa gibi bir ifadede a && b, b değerlendirilecek anlamına gelir. isset($var) false Böylece sizin örnekte, && $var kısmı göz ardı edilir.

Bir && (ve) ifadesi ifadenin yanlış eğer bir parçası kadar değerlendirmeye alınacak ortak yorumlayıcı / derleyici optimizasyon sa. Bir kısmı doğrudur kadar || (ya) ile ifade değerlendirilecektir.

Unutmayın:

false && ?? => false
true && true => true
true && false => false

true || ?? => true
false || true => true
false || false => false

PHP (diğer dillerde ve çok), mantıksal operatörler kullanın short circuit evaluation. Bir ifadenin sonucu zaten ifadenin bir bölümünü değerlendirdikten sonra tespit edilmesi halinde bu demektir, daha sonra gerisi artık değerlendirmeye alınmayacaktır.

Sizin örnekte isset($var) false döndürür. && operatörü doğruysa, bu sol alt ifade false ise gerçek olamaz anlamına gelir sadece all onun alt ifadeleri doğruysa olduğu gibi tanımlanır beri. Bu nedenle, sağ alt ifade değerlendirilir olmayacak (ve bir hataya neden olmaz).

Eğer bu olmaz garanti başka bir ile bir çalışma zamanı hatası yol açacak bir alt-ifade birleştirebilirsiniz, çünkü kısa devre değerlendirme çok yararlıdır. Bir örnek vermiş biridir. Diğer dillerde, genellikle, örneğin null-save yapıları, için de benzer bir yapı kullanmak if (foo != null && foo.bar == 1) Java veya C # - foo.bar foo boş olsaydı bir istisna neden olur, ama kısa devre değerlendirme teminat erdemleri bu değerlendirilecektir asla.