Представьте себе, что кто-то указывает 035
как количество для покупки какого-либо продукта (ведущий 0
только для заполнения, поэтому он соответствует другим трехзначным количествам в списке).Очевидно, что 035
будет интерпретироваться так же, как и 35
для непрограммиста.Но если бы PHP интерпретировал восьмеричные числа в строках, результат внезапно был бы 29
=> WTF?!?С другой стороны, шестнадцатеричная нотация представляет собой меньшую проблему, потому что люди обычно не указывают числа, используя нотацию 0x23
.
Это, кстати, случается не только с конечными пользователями, но и с программистами.Часто программисты пытаются дополнить свои числа ведущими нулями и - да, все не так!Вот почему JS больше не разрешает восьмеричную запись в строгом режиме, а другие языки используют более явный префикс 0o
.
Кстати, я согласен, что это поведение несовместимо.В моих глазах шестнадцатеричное обозначение также не должно быть проанализировано.Так же, как восьмеричной и двоичной записи нет.Особенно если учесть, что явное приведение (int)
также не анализирует шестнадцатеричный код, а вместо этого просто читает все до первого нецифрового числа.
Обращаясь к случаю intval
, оно фактически ведет себя так же, как документировано: intval
не предназначен для анализа нативных целочисленных нотаций PHP, он предназначен для анализа целых чисел указанной базы .Если вы посмотрите на документы , вы обнаружите, что он принимает второй аргумент $base
, который по умолчанию равен 10
.(Между прочим, (int)
, брошенный, кстати, внутренне отображается на тот же convert_to_long_base
вызов с base = 10
, поэтому он всегда будет вести себя точно так же, как intval
.)