Почему мой тест на неравенство терпит неудачу?

58
6

Когда-либо flaky Xdebug находится на fritz в mo '(нормальная служба будет возобновлена ​​как можно скорее), поэтому я сводится к "debug by echo".


echo($path_info['filename'] . '    ' . $licence['issue_timestamp'].'<br>');      
if ($path_info['filename'] != $licence['issue_timestamp'])
{
die('They are NOT equal');
$_SESSION['error_messages'][] = 'This licence file has been copied';
return False;
}
else
die('They are equal');

выходы


1319266557_   1319266557
They are equal

Любая идея, что я делаю неправильно? Есть ли что-то особенное в отношении (отстающих) подчеркиваний?

спросил(а) 2011-10-24T11:48:00+04:00 8 лет, 2 месяца назад
2
Решение
81

docs state:


$a != $b Not equal TRUE if $a is not equal to $b after type juggling.



И этот "жонглирование типа" выглядит подозрительно. В другом месте на этой странице он упоминает:


Если вы сравниваете число со строкой или сравнение включает в себя числовые строки, каждая строка преобразуется в число и выполняется сравнение численно. Эти правила также применяются к оператору switch. Преобразование типа не выполняется, если сравнение === или !==, поскольку это предполагает сравнение типа и значения.



И пример - мертвая распродажа относительно того, что происходит в вашем случае:


var_dump(100 == "1e2"); // 100 == 100 -> true


В терминах преобразования строк в целые числа можно увидеть здесь. Яркий бит (мой смелый):


Если строка не содержит символов ".", "e" или "E", а числовое значение вписывается в ограничения типа целочисленного типа (как определено в PHP_INT_MAX), строка будет оцениваться как целое число. Во всех остальных случаях он будет оцениваться как float.

Значение задается начальным частью строки.

Пример: $foo = 1 + "10 Small Pigs"; // $foo is integer (11)



Итак, почему "123_" равно "123" (a) . В нижней строке используйте !==, так как это гарантирует, что значение и тип совпадают.


(a) См. онлайн-исполнитель PHP:
enter image description here

ответил(а) 2011-10-24T11:52:00+04:00 8 лет, 2 месяца назад
Еще 1 ответ
71

Одна из костяных вещей, которые делает PHP, заключается в том, что == сравнивает значения "после манипуляции с типом" . Это означает, что, по мнению большинства здравомыслящих людей, == действительно === в PHP. Попробуйте

$path_info['filename'] !== $licence['issue_timestamp'].

ответил(а) 2011-10-24T11:51:00+04:00 8 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема