То ли воздух нынче пьян, то ли леший нынче рьян...

MiksIr

miksir@home:~$
Любовь - прекрасное чувство, но когда мне объясняют, что строка '8' равна строке '000000000008' - у меня чувство, что меня на... эээ... обманывают.
Не.... нет никаких строк, есть абстрактные 8 и 0000008.
А строки - это уже ===
Меня вот больше волнует, почему вот такое не работает:
PHP:
<?php
class A {
  public function __toString() {
    return "2";
  }
}
$a = new A();

echo 5 + $a;
 

Фанат

oncle terrible
Команда форума
Дошло наконец про любовь. Блин, натурально в голове что-то замкнуло.
Не. Замкнуло - это меня как раз на ночь глядя.

Если сравнивать строки с числами - ок, я понимаю такую заботу
Если сравнивать строку со строкой - я не хочу, чтобы меня так любили
 

WMix

герр M:)ller
Партнер клуба
MiksIr
хоть и извращение, но соглашусь что это странно! приятно что ругнулся хотяб
Код:
PHP Notice:  Object of class A could not be converted to int in /home/wmix/Arbeitsfläche/11.php on line 9
PHP Stack trace:
PHP   1. {main}() /home/wmix/Arbeitsfläche/11.php:0
 

Ragazzo

TDD interested
Фанат
ты ведь на devconf будешь выступать? т.е. у тебя около 10 лет разработки на php, но при этом ты не сталкивался с static, и такими строками, и будешь всем рассказывать про sql-inj? ;) Т.е на девкофн любой может попасть докладчиком? :S
 

Фанат

oncle terrible
Команда форума
Любой, конечно.
Если у ему есть, что рассказать.
Про инъекции я, кстати, рассказывать ничего не буду.
Я буду рассказывать про защиту от них.

Ты, кстати, так и не родил до сих пор никакого внятного объяснения, почему им в ломы было сделать отдельный кейс для двух строк.
Почему для сравнения строк юзается math

Я понимаю соглашение, по которому мы используем math, когда один из операндов - число.
Но я не понимаю, что делает usual math в случае, когда у нас две строки.
 

С.

Продвинутый новичок
Мне вот непонятно скорее другое... ;) Почему "017" тогда уж 17, а не 15 ;)
Потому что 017 это внутренний числовой литерал языка РНР, интерпретироемый по внутренним правилам РНР. А "017" это какое-то возможно внешнее данное и интерпретироваться по внутренним правилам РНР оно не может. Используется более "обывательская" интерпретация, в частности упомянутая zerofill.
Гриш, в мускуле-то этот зерофил и не дает равенства! :)
PHP:
mysql> select "8" = "000000008";
+-------------------+
| "8" = "000000008" |
+-------------------+
|                 0 |
+-------------------+
"0000008" (строка) и 0000008 (INT ZEROFILL) это разные вещи в SQL.
 

Фанат

oncle terrible
Команда форума
"0000008" (строка) и 0000008 (INT ZEROFILL) это разные вещи в SQL.
Ну, то есть, ты хочешь сказать, что раз Mysql умеет сравнивать своих зерофилов из коробки, то такое извращение не понадобилось? А в пыхе пришлось подставлять такой вот костыль, чтобы сравнивать зерофила, пришедшего из базы, с честным числом, но пришедшим из браузера?

Как-то уж очень натянутым мне кажется такое объяснение.
 

С.

Продвинутый новичок
ZEROFILL это лишь способ визуализации информации. Внутри SQL сравнение с зерофил колонкой таким образом сводится лишь к "8"=8
Например SELECT ... WHERE `amount`='8' вполне естественно и очевидно, будь `amount` зерофил или нет. Это не особое "умение из коробки", а естесвенное поведение.

Пришло ли зерофильное число из базы или бразузера не важно. Оба источника являются человеко-ориентированными (бразузер даже в каком-то смысле в большей степени) и соответственно требует обывательской интерпретации. Оба варианта пустили по общей схеме, что по-моему вполне естественно. Очевидно, что случаев, когда ведущие нули важны будет гораздо меньше.
 

Фанат

oncle terrible
Команда форума
Очевидно, что случаев, когда ведущие нули важны будет гораздо меньше.
"09522313" == "9522313" при том, что 095 и 952 - коды... Ну, не знаю.
Имхо, как раз наоборот - если ведущие нули есть, то они обычно что-то значут.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ты, кстати, так и не родил до сих пор никакого внятного объяснения, почему им в ломы было сделать отдельный кейс для двух строк.
Почему для сравнения строк юзается math
Потому что все данные, пришедшие из базы и из GET/POST по своему типу — строки. Но естественно, эти данные нужно сравнивать как числа, если они являются числовыми, т.к. php — язык с очень мягкой динамической типизацией, и очень сильным автокастингом, за счет чего и вылез в свое время. Хочешь сравнить с учетом типа, без автокастинга — юзай ===, он для этого и придуман.
В чем проблема?
 

Фанат

oncle terrible
Команда форума
Потому что все данные, пришедшие из базы и из GET/POST по своему типу — строки. Но естественно, эти данные нужно сравнивать как числа, если они являются числовыми
Во. Точняк! Что-то такое шевелилось у меня в голове, но никак не могло сформулироваться.
Сравнение же - это не только равенство, но и больше-меньше!
А тут, как раз, принципиально важно, чтобы 11 было больше 9. потому-то и пресловутый "usual math".

И поскольку compare_function() делает всё разом, то == просто под раздачу попало.
 

Dez

Новичок
Меня вот больше волнует, почему вот такое не работает:
Потому что так и не должно работать. Ссылку же раньше кидали про приведение типов, оператор + приводит к числовому типу.
А вот так уже выдаст семерку:
PHP:
echo 5 + (string) $a;
 

Фанат

oncle terrible
Команда форума
в тот момент когда мы дефинировали что любое число умноженное на ноль дает в результате ноль, приходится мириться с тем что делить на ноль мы не умеем!
и если '08'+1 должно давать 9 то понятно что '08' == 8
radiohead, тебе зря нравится это. Объяснение притянуто за уши.

Во-первых, с тем, что '08' == 8, никто не спорит: вопрос вызывает тот факт, что '08' == '8'
Во-вторых, хотя '8dogs' + 1 и даёт 9, но '8dogs' при этом НЕ равно '8'.
Получается, что сложение не является таким уж универсальным до козательством
 

cDLEON

Онанист РНРСlub
Фанат
Я вот до сих пор понять не могу... О чём вообще спор ? Эти "фичи" были заложены во времена, когда из языков используемых для веба, был только перл. Практической пользы, как по мне, они не несут ни какой. Их уже давно нужно выпилить, как редкостный говнокод.
Вопрос в том - зачем это там оставили ? Имхо эти вопросы нужно не в этот форум постить.
 

Фанат

oncle terrible
Команда форума
cDLEON
Ну, это уже другой вопрос.
Меня интересовало - почему так происходит.
Ответ для себя я нашёл.

А выпиливать, имхо, нет смысла. Если хочешь сравнивать строки - с 4 версии существует ===
Код is_identical_function в три раза меньше, чем compare_function, в нем все просто и очевидно.
Если тебе не нравится фича с нестрогой типизацией - не используй её вовсе.
 

WMix

герр M:)ller
Партнер клуба
Во-первых, с тем, что '08' == 8, никто не спорит: вопрос вызывает тот факт, что '08' == '8'
Во-вторых, хотя '8dogs' + 1 и даёт 9, но '8dogs' при этом НЕ равно '8'.
Получается, что сложение не является таким уж универсальным до козательством
на самом деле очень близко из тогоже мануала
PHP:
switch ("a") {
case 0:
    echo "0";
    break;
case "a": // never reached because "a" is already matched with 0
    echo "a";
    break;
}
то нравятся тебе обьяснения о протаколах, то вдруг не понимаешь. я еще на предыдущей странички обьяснял почему
'8.0' == '8' в однотипных переменных типа стринг
 

Фанат

oncle terrible
Команда форума
я еще на предыдущей странички объяснял почему
Меня не совсем устраивает твое объяснение.
Ты пляшешь либо от арифметики, либо от разнотипных переменных. Но переменные у нас однотипные, а сравнение - не арифметика, это другой тип операций. Я тебе привел пример, когда для арифметики и для сравнения переменные кастятся по-разному.
 

cDLEON

Онанист РНРСlub
Я бы сказал, «то вам дорога в руби» — если это выпилить, то преимущества потеряны будут.
Да я не в целом о нестрогой типизации говорю.
преимущества данной "фичи" мне кажутся сомнительными.
Хотя... Я уже больше чем пол года не пишу ни чего серьёзного на похапе.
 

WMix

герр M:)ller
Партнер клуба
Фанат
мне кажется мы о разном, математика это или поддержка проекта "Война и мир" роли не играет, это пример обратной петли.
по теме '008' и '8dogs' кастятся действительно по разному и причина понятна
PHP:
var_dump( is_numeric('8dogs') );
var_dump( is_numeric('008') );
 
Сверху