#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 извините, через минуту после другого сообщения, поэтому он получает ответ. Тем не менее, спасибо.