Я смущен тем, с чем я столкнулся в сценарии, над которым я работал. У меня было следующее:
function getPart($part) { $array = array('a', 'b', 'c'); if ($part == 'first') $part = 0; if ($part == 'last') $part = count($array) - 1; if (isset($array[$part])) return $array[$part]; return false; } $position = 0; echo getPart($position);
Итак, если бы я попробовал строку «первым», я должен был получить «а» в качестве вывода. С строкой «last» я должен получить «c» и так далее. Когда я запускаю скрипт выше, с PHP 5.3, я получаю «c» …
Смущенный, я провел быстрый тест …
var_dump(0 == 'first'); var_dump(0 == 'last');
Оба возвращают TRUE
… ПОЧЕМУ ??? Я так смущен этим поведением!
Если вы попытаетесь сравнить строку с числом, PHP попытается преобразовать строку в число. В этом случае он не может этого сделать, поскольку PHP не может преобразовать «первый» или «последний» в число, поэтому он просто преобразует его в ноль. Это делает проверку 0 == 0
, что, конечно, верно. Используйте оператор идентификации ===
, если вы хотите, чтобы PHP не пытался конвертировать что-либо (так что два операнда должны иметь одно и то же значение и быть одного типа).
Проверьте (int) 'first'
. Это, по сути, то, что делает PHP в правой части операнда.
PHP будет использовать типы операндов, если не использует строгий оператор сравнения равенства ( ===
) между двумя операндами разных типов.
PHP слабо типизирован. То, что происходит, это попытка конвертировать "first"
в число. Он терпит неудачу и возвращает ноль. Теперь он имеет два числа: ноль и ноль. Чтобы не пытаться преобразовать типы, используйте ===
а не ==
.
PHP немного странен в том, что он обрабатывает строку в числовом сравнении как 0. Вы можете принудительно провести сравнение строк, указав переменные:
function getPart($part) { $array = array('a', 'b', 'c'); if ("$part" == 'first') $part = 0; if ("$part" == 'last') $part = count($array) - 1; if (isset($array[$part])) return $array[$part]; return false; }