PHP 5.2.12 - Tamsayılar ve Strings İlginç Anahtarı Bildirimi Bug

2 Cevap
<?php
$var = 0;
switch($var) {
   case "a":
      echo "I think var is a";
   break;
   case "b":
      echo "I think var is b";
   break;
   case "c":
      echo "I think var is c";
   break;
   default:
      echo "I know var is $var";
   break;
}
?>

Belki başkası bu büyüleyici and bir cevap bulacaksınız. Bu çalıştırırsanız, bu çıkışları I think the var is a zaman clearly bu kadar 0. Şimdi, ben bu bizim switch açıklamada dizelerini kullanarak konum ama biz kontrol ediyoruz değişken bir tamsayı olması ile ilgisi vardır çoğu eminim. PHP bu şekilde davranır neden biliyor mu? Bu çok önemli bir şey var, ama bugün bana bir baş ağrısı biraz verdin.

Teşekkürler millet!

2 Cevap

Eğer bir string ile integer karşılaştırdığımızda, string a number dönüştürülür. Yani etkili parçacığını eşdeğerdir:

$var = 0;
switch($var) {
   case 0: // "a" gets converted to 0.
      echo "I think var is a";
   break;
   case 0: // "b" gets converted to 0.
      echo "I think var is b";
   break;
   case 0: // "c" gets converted to 0.
      echo "I think var is c";
   break;
   default:
      echo "I know var is $var";
   break;
}

İlk durumda vücut idam alır gibi çıkış olarak I think var is a üretecek. 3 aday olmasına rağmen o üstünde görünür, çünkü, birincisi seçilir.

Eğer bir switch deyimi veya düzenli karşılaştırma operatörleri kullanarak olsun, bir dize ve bir tamsayı karşılaştırdığınızda (Eğer === operatörü kullandığınız sürece) PHP, dize bir tam sayıya dönüştürülür.

Ve bir tamsayı, bir rakam ya da bir işareti ile ya başlamıyor bir dizeye bir dize dönüştürme her zaman 0'a dönüştürülür.

Belgeleri here görmek ve here.