LINUX.ORG.RU

PHP гибкое сравнение.

 


0

2

var_dump('b73f8714-0a62-11e3-b8fe-e4115bd714a8' == 0);
die();

на выходе получаю true. Читал http://php.net/manual/en/types.comparisons.php
и судя по табличке Loose comparisons with == должен получить false.

Вопрос: я чего-то не понимаю, или мне надо писать багрепорт? Усугубляются сомнения в собственной адекватности тем, что поведение одинаковое во всех версиях PHP начиная с 5.6 и выше.

Deleted

Как мне кажется, строка сравнивается с числом, приводится к нулю, а нуль равен нулю.

Infra_HDC ★★★★★
()
Ответ на: комментарий от Deleted

строка приводится к числу.

согласно правилам приведения, к числу будут приведены только те символы цифр, которые идут в начале строки.

для сравнения без приведений и с проверкой типов используй ===

Ford_Focus ★★★★★
()

'b73f8714-0a62-11e3-b8fe-e4115bd714a8' при таком сравнении приводится к int

var_dump((int)'b73f8714-0a62-11e3-b8fe-e4115bd714a8')
int(0)

А дальше сравнивает 0 == 0 => true

Либо строгое сравнение ===, либо приводи типы самостоятельно, либо сравнивай по другому.

xSudo ★★★
()
Ответ на: комментарий от xSudo

Тогда почему строка '1b' приводится к 1, а строка 'b1' приводится к 0? Вот это вымораживает. Я ожидал одинакового поведения. Переписываю теперь на === подобные вещи.

Deleted
()
Ответ на: комментарий от Deleted

А что не так? parseInt в JS работает так же — приводит к числам только то, что с числа начинается.

xvostostrel
()

и судя по табличке Loose comparisons with == должен получить false

Жопой читал?

no-such-file ★★★★★
()
Ответ на: комментарий от Deleted

почему строка '1b' приводится к 1,

Читает строчку '1b' слева направо до тех пор пока символы являются цифрами. Получает строчку '1', которая приводится к 1

а строка 'b1' приводится к 0?

То же самое, первый же символ является не-цифрой, отчего выходит 'b1' превращается в ", что приводится к 0.

Лично я считаю, что если уж взялись сравнивать строчки с числами, готовьтесь получать _любые_ ответы.

ugoday ★★★★★
()
Ответ на: комментарий от Deleted

Переписываю теперь на === подобные вещи

Зачем вообще сравнивать строку с нулём? Специально же запили даже лайфхак в виде «0» == false, чтобы можно было просто использовать строку в виде предиката. Нет, не хочу удобно, хочу через жопу...

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Код не я писал, мне править достался Ж)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.