Почему мой тест на неравенство не выполняется?

#php

#php

Вопрос:

Постоянно зависающий Xdebug находится на грани сбоя в 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
  

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

Ответ №1:

В документах указано:

$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), строка будет оцениваться как целое число. Во всех остальных случаях он будет оцениваться как значение с плавающей точкой.

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

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

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


(a) Смотрите Онлайн PHP executor: введите описание изображения здесь

Комментарии:

1. Это сработает, только если вы женщина и можете каким-то образом убедить мою жену, что это хорошая идея. Хотя первое возможно, я не вижу, чтобы второе когда- либо возникало 🙂

2. Это мысль, которая имеет значение 😉 (не думаю, что моя жена тоже пойдет на это 😉

Ответ №2:

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

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

Комментарии:

1. 1 извините, через минуту после другого сообщения, поэтому он получает ответ. Тем не менее, спасибо.