В PHP 0 (int, zero) равно «first» или «last» (строки)? - PullRequest
3 голосов
/ 11 июля 2011

Я смущен тем, с чем столкнулся в сценарии, над которым работал. У меня было следующее:

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);

Итак, если бы я попробовал строку «first», я бы получил «a» в качестве вывода. Со строкой «last» я должен получить «c» и так далее. Когда я запускаю скрипт выше, с PHP 5.3 я получаю "c" ...

В замешательстве, я провел быстрый тест ...

var_dump(0 == 'first');
var_dump(0 == 'last');

Оба возвращают TRUE ... ПОЧЕМУ ??? Меня так смущает это поведение!

Ответы [ 4 ]

6 голосов
/ 11 июля 2011

Если вы попытаетесь сравнить строку с числом, PHP попытается преобразовать строку в число.В этом случае этого не происходит, поскольку PHP не может преобразовать "first" или "last" в число, поэтому он просто конвертирует его в ноль.Это делает проверку 0 == 0, что, конечно, верно.Используйте оператор идентификации ===, если вы хотите, чтобы PHP не пытался что-либо преобразовывать (поэтому два операнда должны иметь одинаковое значение и иметь одинаковый тип).

3 голосов
/ 11 июля 2011

Выезд (int) 'first'. По сути, именно это и делает PHP с правым операндом.

PHP будет приводить типы операндов, когда не используется оператор сравнения строгого равенства (===) между двумя операндами разных типов.

1 голос
/ 11 июля 2011

PHP слабо типизирован.Там происходит попытка конвертировать "first" в число.Это терпит неудачу, и возвращает ноль.Теперь у него есть два числа: ноль и ноль.Чтобы не пытаться конвертировать типы, используйте === вместо ==.

0 голосов
/ 11 июля 2011

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...