2017-01-12 30 views
5

Czy ktoś mógłby wyjaśnić, dlaczego sprawa „a” nigdy nie osiągnął w poniżej kodu i dlatego zawsze będzie wykonać przypadek 0Proszę wyjaśnić, dlaczego sprawa przełącznik PHP jest zawsze wykonanie case 0 w tym kodzie

switch ("a") { 
case 0: 
    echo "0"; 
    break; 
case "a": // never reached because "a" is already matched with 0 
    echo "a"; 
    break; 
} 
+0

przełącznik nie może być stosowany na ciąg znaków i liczb w tym samym czasie [czytaj więcej] (http://php.net/manual/en/control-structures.switch.php#82351) – happymacarts

+0

tylko przypuszczenie, ale fakt, że niektóre wartości przełączników są ints, a niektóre są łańcuchami, może powodować problem. – John3136

Odpowiedz

3

PHP, jak JavaScript lub Perl, jest luźno wpisane język i będzie próbować odgadnąć, co chcesz zrobić. W tym przypadku zmienił twój ciąg na najbliższą liczbę całkowitą, jaką mógł znaleźć, czyli zero. Innymi słowy, "a" == 0 jest prawdziwym stwierdzeniem w PHP.

Więcej na ten temat można znaleźć w PHP . Sugeruję, abyś wypisał wartość w instrukcji switch lub zastąpił ją konstruktem if//else.

+1

Połączyłem zły przykład ... https://3v4l.org/tC3pt. To nie jest tak przewidywalne, z tego co mogę powiedzieć. –

+0

Interesujące, wydaje się, że czasami jest to wartość w 'select', która jest żonglowana, a czasami jest to wartość w' case'. – miken32

+0

Tak, to bardzo dziwne. Spróbuj wprowadzić wartość '$ x =" 0 ";' ... Widzę, że byłaby ona fałszywa, ale jednocześnie jest dosłowną wartością "0" i nadal faworyzuje "fałsz" w stosunku do rzeczywistego przypadku. Myślę, że ma to jakiś związek z zamówieniem, ale nie mogę być tego pewien. –

2

Można nie używane miksowanie w instrukcji switch, ponieważ PHP zinterpretuje znaczenie tego, co masz na myśli.

W kategoriach laika spróbuje znaleźć "wartość", która nie jest zdefiniowana w procesorze, a zatem w tym przypadku wynosi 0.

sama trafi na poniższym kodzie:

<?php 

$x = "a"; 
switch($x) 
{ 
    case "c": 
     echo "c"; 
    break; 

    case 1: 
     echo "1"; 
    break; 

    case 0: 
     echo "0"; 
    break; 

    case "a": 
     echo "a"; 
    break; 

    case false: 
     echo "false"; 
    break; 

    default: 
     echo "def"; 
    break; 
} 

?> 

Documentation is available at PHP.net

1

Typem zmiennej używane w przypadku() powinno być stosowane w taki sam rodzaj przełącznika().

<?php 
    switch ("a") { 
     case "0": 
      echo "0"; 
      break; 
     case "a": // never reached because "a" is already matched with 0 
      echo "a"; 
      break; 
    } 

Dla typu integer:

<?php 
switch (1) { 
    case 0: 
    echo 0; 
    break; 
    case 1: // never reached because "a" is already matched with 0 
    echo 1; 
    break; 
} 
1

Powodem tego jest fakt, switch używa loose comparison==

To powiedział:

if ("a" == 0) // TRUE 
if ("a" == true) // TRUE 

Prawie nic innego oceni false. (z wyjątkiem "a" == "a")

Tak więc, jeśli istnieje potrzeba porównania obu łańcuchów i liczb całkowitych, należy po prostu przekonwertować na ciąg do porównania.

//$var = "a"; 
$var = 0; 

$var = strval($var); 
switch ($var) { 
    case '0': 
     echo "0"; 
     break; 
    case 'a': 
     echo "a"; 
     break; 
}