Pull to refresh

Comments 17

что вы к бедному IEEE 754 «привязались»? :) Там и на точное равенство проверять нет смысла в общем-то… А если оператор равенства определить через допустимую погрешность и норму (модуль) разности, то отношение равенства перестанет быть транзитивным. Это известные проблемы к PHP имеющие очень опосредованное отношение.
Так ведь модно нынче ругать php.
И не модно держать в голове логику про приведение типов.

Ну, а что, такие задачи ведь каждый день возникают: сравнивать NAN, INF и stdClass.
За перевод спасибо, но такие вопры бы у людей не появлялись, имей они желание прочесть документацию по этой теме.
P.S. Вот StackOverflow хороший ресурс, там быстро можно найти ответ на вопрос, но благодаря таким как он в нашей профессии появляется много персонажей, считающих себя программистами и пожеланиями к зп over9000. Спасибо сообществу phpclub'а, которое задавающих вопросы новичков отправляет читать доки.
Небольшее уточнение: «задающих подобные вопросы», разумеется.
Почему? Если разработчик не умеет искать информацию/шерстить мануалы — то грош ему цена.
Интересно. У каждого продукта есть доки, кукбуки. Существуют манулы и прочее. Но как вы определяете когда человека надо отправить читать доки, а когда ответить? Ясно что если вопрос по матчасти — возможно стоит и не отвечать. Но вот если вопрос более-менее сложен?
Информация зачастую и берется из подобных вопросов, так что их нужно задавать и не стесняться.
Я как раз про мат. часть, по факту вопрос из топика именно связан с ней. А если он более или менее сложен, то лично мне прикольно самому поразбираться, в чём может быть заковырка, копнуть глубже. В 90% случаев проблема решается, в остальных — эксперименты, упорное гугление, общение с коллегами и пр. Да я о стеснении ничего и не говорю (в этом ничего постыдного нет, не знать — не стыдно, стыдно — не хотеть узнать новое), я о том, что людям лень потратить 5-60 минут своего времени на решение очевидной проблемы, поэтому они создают 1001 вопрос по своей проблеме не удосужившись зайти в гугл. А вообще, сейчас многие люди идущие в ИТ по факту идут по тому пути, по которому несколько лет нахад прошли многие «юристы», «экономисты» и «менеджеры», они людей претендуют на должности, оклады и пр., совершенно не умея пользоваться подручными средствами для решения своей задачи. Хотя, пофиг, за счёт таких у меня зп выше. Нехорошо то, что несмотря на популяризацию ИТ, область становится достаточно попсовой. Приходит человек на собеседование как server-side dev, а на вопрос об отличиях GET и POST, каким образом веб-сервер определяет какой код запустить, если на одном IP хостится N сайтов, etc. он не способен. И не считает эти знания необхомыми. И таких реально очень много, поверхностные знания есть, а копни поглубже — там ноль. В общем, «за державу обидно».
А чего обижаться? То что порог входа у php низкий — с моей точки зрения не совсем корректно. Низкий порог входа для получения быстрого первичного результата. Нельзя просто так взять и вывести на других языках страничку, работать с базой и обрабатываеть HTTP запросы. Но как только задача выходит за эти рамки — тут и появляется тот самый порог, которые некоторые преодолеть не могут. И нечего обижаться — они либо преодолеют, либо просто выбрали не то.
Мне скорее обидно за тех, кто принимает поделки на популярных cms(нет, я не сколько не умиляю достоинств этих cms — я хочу сказать, что на них просто сделать «поделку»), которые заказчики принимают от незнания.
Обидно не за то, что у PHP порох входа низкий, люди не доросли и пр., обидно за то, что люди, приходящие в ИТ (которые, по факту, потенциальные коллеги) не хотят думать (хотя казалось бы, как без этого?), но ещё и уверены, что они правы, что им должны всё преподнести на блюдечке с голубой каёмочкой. Реально встречалось в практике, когда взрослый, казалось бы, человек, порол откровенную чушь, и ещё был уверен в том что он прав, а не другие, с девизом по жизни «Я — Д'Артаньян, а вы — ...» и подходом — я буду теоретизировать, и говорить что прав, вместо того, чтобы проверить на практике.
Разумеется, такое везде было, есть и будет, но очень удивляешся, когда человек имеющий максимум 1/10 твоих знаний и опыта просит ту сумму, которую ты получаешь. (Да, я материалист, но по-мимо денег работаю себе в удовольствие)
О том что вопрос не так прост косвенно говорит размер репутации спрашивающего. Размер репутации ответившего и тот факт, что это один из разработчиков PHP.

А вопрос действительно не так прост(как и ответы). Документация не даёт полной картины всего и в ней не учитываются некоторые тонкости. Поэтому и был задан этот вопрос, поэтому и был получены эти ответы. И теперь вы сможете найти ответ на этот вопрос в поисковике, а не проводить собственные исследования, которые займут несколько часов (об этом говорит история правок ответов).
Кстати, второй ответ тоже можно было привести. Хотя бы частично.
Часть вопросов сразу отпадает, если держать в голове простое правило: если в сравнении с одной стороны число, то PHP оставшееся значение тоже приведёт к числу.

Давайте посмотрим на примеры из статьи:
var_dump(true == "a"); // bool(true) ← числа нет. сравнивается «истина» и непустая строка неравная нулю → истина 
var_dump("a" == 0);    // bool(true) ← число есть. левую часть тоже к числу. "а" преобразуется к нулю. → истина
var_dump(true == 0);   // bool(false) ← число есть. правую часть к числу. «true» преобразуется в единицу → ложь
Если непонятно как работает неявное приведение типов — можно использовать явное и почти вся «магия» исчезнет.
Собственно достаточно запомнить что к чему приводится и никаких сложностей не будет.
Еще можно с помощью SPL Types переопределить свои типы Int, Float, Bool, String и использовать их вместо стандартных типов:
function f(Int $a)
{
    $b = new Int($_GET['b']);
    echo $a == $b; // неопределенность исключена
}
Правда код со всем этим будет выполняться в разы медленнее, а php и так не быстрый язык.
Не понял, как сравниваются строки. Можно на пальцах для чайников? Как производится приведение?

$a = "true";
$b = "false";
$c = "lol";
$bool = true;

if($a > $b){ // true
	echo "true<br />";
} else {
	echo "false<br />";
}

if($b > $c){ // false
	echo "true<br />";
} else {
	echo "false<br />";
}

if($a > $c){ // true
	echo "true<br />";
} else {
	echo "false<br />";
}

if($b == $bool){ // true
	echo "true<br />";
} else {
	echo "false<br />";
}
Документация говорит, что строки и ресурсы переводятся в числа, обычная математика. Т. е. берется первый символ из левой и правой части, и сравниваются их коды. Точно также работает сортировка.

В случае $b == $bool строка приводится к булевому типу, а так как она не пустая, значит приводится к значению true.
Sign up to leave a comment.

Articles