Почему этот код выводит 1? - PullRequest
1 голос
/ 16 марта 2011
$t = true;
switch($t)
{
    case 1*2:
        echo 1;
}

Ответы [ 3 ]

11 голосов
/ 16 марта 2011

В руководстве для переключателя / корпуса написано:

Обратите внимание, что переключатель / корпус не выполняет сравнения.

И true == 2 верно .

4 голосов
/ 16 марта 2011

A switch оператор делает слабое сравнение между проверенным выражением и выражениями в case метках типа.

В этом случае это означает, что компилятор определяет, если true == 2. Поскольку любое отличное от нуля целое число сравнивается равным true, ветвь берется и выполняется echo 1;.

Вот менее интуитивный пример, когда действует точно такой же механизм. Вы можете объяснить это с помощью той же логики:

$foo = 'hello';
switch($foo) {
    case 'A' || 'B':
        echo "Test succeeded";
}

Я использовал этот пример в прошлом при обучении новичков PHP, чтобы они могли понять, как работает свободно типизированный язык.

0 голосов
/ 16 марта 2011

В PHP (и в большинстве языков программирования) ненулевое значение означает true, когда обрабатывается в условном выражении. В этом случае $ t (true) равно любому числу, отличному от нуля, поэтому оно соответствует условию случая. Выход будет 1.

...