php > var_dump("66" > "555");
bool(false)
php > var_dump(strcmp("66", "555"));
int(1)
php > var_dump(5 > "a");
bool(true)
php > var_dump("5" > "a");
bool(false)
Более того, результат зависит не только от типа данных, но и самих данных.Т.е. результат операции зависит от типа данных. А у нас, вроде, нетипизированный яп.
Так оно так сейчас и работает.Не, если is_numeric с обоих сторон - переводим в числа, если хотя бы с одной стороны невалидное число - сравниваем как строки.
Такая логика мне кажется менее подвержена нежданчикам.
$ php -r 'var_dump("0x00" < "0.01", is_numeric("0x00"), is_numeric("0.01"), 0x00 < 0.01);'
bool(true)
bool(true)
bool(true)
bool(true)
$ php -r 'var_dump($a = sprintf("%032b", unpack("N", "0x00")[1]), $b = sprintf("%032b", unpack("N", "0.01")[1]), $a < $b);'
string(32) "00110000011110000011000000110000"
string(32) "00110000001011100011000000110001"
bool(false)
О..ть, я не знал. PHP такой PHP.Convert NULL to "", numerical or lexical comparison
А не могли бы вы эту закономерную и логичную концепцию описать словами? В части сравнения integer и произвольной строки. И в части неявного приведения string ключей массива к integer.Более того, результат зависит не только от типа данных, но и самих данных.
Все очень логично и закономерно. Многия тысяча скриптов крутятся десятилетиья и ничего не ломается. Проблемы возникают только у чайников, не понимающих концепцию и не делающих валидацию данных.
$a = [ '999' => 'xxxx']; var_dump(key($a)); => int(999)Никогда ни прикаких обстоательствах не может в скрипте образоваться строковая величина, представленная в виде integer.
Простите , а на какой версии PHP он Вам выдал var_dump( '20110204024217300000' == '20110204024217300264' ) в true, а var_dump( '20110204024217300000' < '20110204024217300264' ); в false ?ну и это тоже
Код:php > var_dump( '20110204024217300000' > '20110204024217300264' ); bool(false) php > var_dump( '20110204024217300000' < '20110204024217300264' ); bool(false) php > var_dump( '20110204024217300000' == '20110204024217300264' ); bool(true) php >
root@linux-debian-1:~# php -a
Interactive mode enabled
<?php
var_dump( '20110204024217300000' < '20110204024217300264' );
var_dump ( '20110204024217300000' == '20110204024217300264' );
echo PHP_INT_MAX, " ", PHP_VERSION, " ", PHP_OS;
?>
bool(true)
bool(false)
2147483647 5.4.35-0+deb7u2 Linuxroot@linux-debian-1:~#
root@keeper:/home/keeper# php -a
Interactive mode enabled
php > var_dump( '20110204024217300000' < '20110204024217300264' );
bool(true)
php > var_dump ( '20110204024217300000' == '20110204024217300264' );
bool(false)
php > echo PHP_INT_MAX, " ", PHP_VERSION, " ", PHP_OS;
9223372036854775807 5.6.3-1 Linux
php >
keeper@keeper:~$ php -r "var_dump('20110204024217300000' + 1); var_dump(PHP_INT_MAX);"
float(2.0110204024217E+19)
int(9223372036854775807)
root@linux-debian-1:~# php -r "var_dump('20110204024217300000' + 1); var_dump(PHP_INT_MAX);"
float(2.0110204024217E+19)
int(2147483647)
Из вашего же вопросаПростите , а на какой версии PHP он Вам выдал var_dump( '20110204024217300000' == '20110204024217300264' ) в true, а var_dump( '20110204024217300000' < '20110204024217300264' ); в false ?
Вот результат для PHP на 32 битной ОС
PHP:root@linux-debian-1:~# php -a Interactive mode enabled <?php var_dump( '20110204024217300000' < '20110204024217300264' ); // false var_dump ( '20110204024217300000' == '20110204024217300264' ); // true echo PHP_INT_MAX, " ", PHP_VERSION, " ", PHP_OS; ?> bool(false) bool(true) 2147483647 5.4.35-0+deb7u2 Linuxroot@linux-debian-1:~
Нет "классических 4G" языков, это фейк. И PHP обычный 3G язык. И типизация вообще к этому отношения не имеет. Просто в PHP слишком много соглашений, которые просто "нужно помнить". И в общем для языка это не очень хорошо. За это PHP и не любят - он привлекает внешне легкостью входа, а когда вошедшие начинают учится - вокруг них поле граблей, что рождает говнокод и кучу тем на форумахВот именно, что твоя проблема в том, что ты ожидаешь, будто РНР должен вести себя как язык 3-го поколения. Surprise! Он не является таковым. РНР -- это концептуально 4G язык, построенный на 3G движке, Некий гибрид, и в этом его прелесть. Классические 4G языки просто не заработали по определенным причинам. Ни один так и не взлетел, а РНР цветет и пахнет.
Простите, закопипастил не так)) Т.е. все верно и ожидаемо. Не смог получить результатЮ, как пишет @WMaxИз вашего же вопроса
root@linux-debian-1:~# php -a
Interactive mode enabled
<?php
var_dump( '20110204024217300000' < '20110204024217300264' );
var_dump ( '20110204024217300000' == '20110204024217300264' );
echo PHP_INT_MAX, " ", PHP_VERSION, " ", PHP_OS;
?>
bool(true)
bool(false)
2147483647 5.4.35-0+deb7u2 Linuxroot@linux-debian-1:~#