Задать вопрос

("PHP" == 0) => true, зачем?

Здравствуйте,


вопрос про саму операцию уже был в q&a: Типы в PHP. Разрыв шаблона. Ответ сводится к простому — «ПАТАМУШТА».


В кратце:
var_dump(&quot;php&quot; == 0); //true<br/>


Мой вопрос состоит, а зачем? В любом случае такое нестандартное поведение было реализованно с какой-то целью. Есть у кого реальные примеры использования этой фичи или встречи с граблями из-за нее?
  • Вопрос задан
  • 4807 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 9
Gorthauer87
@Gorthauer87
Программист
Интересно, почему же не пустая строка приводится к нулю, хотя она должна, по крайней мере, приводится к единице?
Ответ написан
давайте по пунктам.
1. В РНР нет строгой типизации. Это факт.
2. Из п. 1 следует, что типы будут приводиться автоматически в некоторых случаях.
3. Строка приводится к числу именно так: (int)«PHP»; // 0
(мне это кажется логичным)
4. Чтобы сравнить два разных типа, нужно один привести к другому. С этим тоже глупо спорить.
5. Вот тут, возможно, неочевидный момент — в РНР для этого строка приводится к числу. Это описано в документации.
Ответ написан
Практическое применение:

Поле ввода, которое подразумевает числовое значение, например, сумма перевода. Пользователь вводит строку «тыща баксов». Нормальной валидации нет (почему — отдельный вопрос). Перевод уходит только если сумма больше нуля. Строка преобразуется в ноль и перевод не уйдёт. Если бы преобразовалась в 1 (true), то перевод бы ушел с не очевидной для пользователя суммой, минимум багофича. А ещё лучше в -1 (true true :) ) и вообще никакой валидации — перевод бы получился отрицательным — критический баг.

PHP, имхо, разрабатывался так, чтобы снизить число таких критических багов.
Ответ написан
@edogs
Ответ там был не «патамушта», а «потому что строковый тип приводится к числовому».
И тогда становится более понятной логика (хотя ее разумность все еще сомнительна).
Не забывайте, что php язык изначально простой для построения простых страниц. Оттуда там всякие штуки типа глобальных (что бы не усложнять себе жизнь $_GET) и автослешей (что бы не усложнять себе жизнь addaslashes ($_GET) при вставке в БД).
Практика? Например:
var_dump(«1 руб»==1);//true
Ответ написан
@edogs
А, по поводу граблей еще был вопрос.
Поищите одно из описаний уязвимости в phpbb, достаточно критичной. Там одна из проверок шла вида if($a==$b), при этом $b бралось из сериализованного массива, хранящегося в cookies у пользователя. Соответственно скрипт ожидал строковой переменной и сравнения вида «login»==«admin», а тут внезапно приходило число, и сравнение превращалось в «login»==0, после чего наступал эпик фэил. Ну, это не очень точный рассказ, просто суть к тому сводилась.
Ответ написан
@gro
Здесь неоднократно дали правильный ответ — «строка приводится к числу», но почему так делается для многих даже правильно ответивших неочевидно.
Вообще всё просто — в $_GET и $_POST всегда строки, хотя некоторые переменные подразумеваются числовыми, из базы тоже зачастую даже числовые поля приходят в строковом виде, ну и одна из основных задач PHP — обработка текста (в том числе XML), где опять-таки приходится работать с числами в виде строк.
Поэтому строки и рассматриваются зачастую, как числа.
Ответ написан
@shagguboy
>Мой вопрос состоит, а зачем?
пхп задумывался как язык с нестрогой типизацией. весьма нестрогой. так что это просто багофича языка.
>Есть у кого реальные примеры использования этой фичи
постоянно пишу что то типа
if($str){

}
else{

}
Ответ написан
@Strate
var_dump("php" == 0); // true
var_dump((int)"php" == 0); //true
var_dump("php" == (string)0); //false
Ответ написан
Комментировать
trickii
@trickii Автор вопроса
Вот, кстати, и пример граблей, буквально вчера нашли:
От сервиса получаем курс как число или "--" в случае отсутствия. Дальше был такой код:

$price = count($price) > 0 ? (float) str_replace(',', '.', $price[0]) : 0;


Который выполнялся неверно, т.е. "--" превращался в -0. Понятно что "--" здесь не в тему, но таковы реалии, сервис не наш. Что характерно (integer) дает просто 0.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы