This is an old revision of the document!
PHP RFC: Explicit octal integer literal notation
- Version: 1.0
- Date: 2020-10-20
- Author: George Peter Banyard, girgias@php.net
- Status: Draft
- First Published at: https://wiki.php.net/rfc/explicit_octal_notation
Introduction
PHP's literal octal notation can lead to some confusing results such as "016" == 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 and 0O
when using the octdec()
and base_convert()
functions.
Proposal
Add support for the explicit octal notation 0o
for integer literals analogous to 0x
and 0b
for hexadecimal and binary.
0o16 === 14; // true 0o123 === 83; // true 016 === 0o16; // true
Behaviour of numeric strings
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.
Therefore, this RFC has no impact on numeric strings. “0o16”
is still interpreted as a string and only a string.
Backward Incompatible Changes
None
Proposed PHP Version(s)
Next PHP 8.x.
RFC Impact
To Existing Extensions
Added support to the GMP extension.
Added support to the FILTER_VALIDATE_INT
filter when using the FILTER_FLAG_ALLOW_OCTAL
flag
To Opcache
None
Unaffected PHP Functionality
Implicit octal notation is unaffected.
Future Scope
- Deprecate the implicit octal notation.
- Support hexadecimal, octal, and binary numbers in strings
Proposed Voting Choices
Per the Voting RFC, there is a single Yes/No vote requiring a 2/3 majority for this proposal to be accepted.
Patches and Tests
GitHub patch: https://github.com/php/php-src/pull/6360
Language specification patch TBD.
Implementation
After the project is implemented, this section should contain
- the version(s) it was merged into
- a link to the git commit(s)
- a link to the PHP manual entry for the feature
- a link to the language specification section (if any)