PHP's literal octal notation can lead to some confusing results such as 16 === 016
evaluating to false. This is because 016
is evaluated as an octal integer and resolves to 14
.
This convention for octal integers is well established and followed by many programming languages (Java, C, C#, Golang, Haskell, and more). However, Python, JavaScript, and Rust [1][2][3] only accept or support an explicit octal notation 0o
.
Surprisingly PHP already has support for this notation when using the octdec()
and base_convert()
functions.
Add support for the explicit octal notation 0o
/0O
for integer literals analogous to 0x
/0X
and 0b
/0B
for hexadecimal and binary.
0o16 === 14; // true 0o123 === 83; // true 0O16 === 14; // true 0O123 === 83; // true 016 === 0o16; // true 016 === 0O16; // true
As of PHP 7.0, hexadecimal numbers in strings are not considered numeric [4], as the behaviour was inconsistent with type casting. Adding complete support for hex numbers in strings was rejected because adding it for other numeric types would be complex and confusing. In particular:
supporting octal numbers is not possible, because handling the string '0123' as the number 83 would be highly unexpected for end users of an application.
Numeric strings in PHP are always decimal. Analogous to the example from the introduction "016" == 016
evaluates to false as (int) "016"
evaluates to 16
.
This RFC has no impact on the behaviour of numeric strings. “0o16”
would still be interpreted as a string and only a string. Moreover, (int) "0o16"
will continue to evaluate to 0
.
None
PHP 8.1.
Added support to the GMP extension.
Added support to the FILTER_VALIDATE_INT
filter when using the FILTER_FLAG_ALLOW_OCTAL
flag
None
Implicit octal notation is unaffected.
FILTER_VALIDATE_INT
filter to only allow octals with the explicit octal notation.Per the Voting RFC, there is a single Yes/No vote requiring a 2/3 majority for this proposal to be accepted.
GitHub patch: https://github.com/php/php-src/pull/6360
Language specification patch TBD.
Merged into PHP 8.1