PHP RFC: Normalize increment and decrement operators


The current behaviour of increment and decrement operators is not very intuitive:

// booleans
$a = false; ++$a; // bool(false)
$a = true; --$a; // bool(true)
// null values
$a = null; --$a; // null
$a = null; ++$a; // int(1)
// empty strings
$a = ''; ++$a; // string(1) "1"
// non-numeric strings
$a = '12d9'; 
++$a; // string(4) "12e0"
++$a; // float(13)


The proposal is:

  1. always treat boolean and null types as an integer, but raise a warning.
  2. deprecate alphanumeric increment and introduce str_inc() and str_dec().

Operation on bool / null

// booleans
$a = false; 
++$a; // int(1) + warning
++$a; // int(2)
$a = true; 
--$a; // int(0) + warning
--$a; // int(-1)
// null values
$a = null; --$a; // int(-1) + warning
$a = null; ++$a; // int(1) + warning

Operation on alphanumeric strings

// non-numeric strings
$a = '12d9'; 
++$a; // string(4) "12e0" + Notice: String increment is deprecated, use str_inc() instead in php shell code on line 1
++$a; // float(13)

Additionally, it makes two new string functions available:

  • str_inc($str) - to perform the current string increments.
  • str_dec($str) - the string decrement.

Backward Incompatible Changes

Incrementing null will now raise a warning; incrementing alphanumeric strings will raise a deprecation notice.

Proposed PHP Version(s)


Open Issues


Unaffected PHP Functionality

The changes do not affect the following data types:

  • array
  • int
  • float
  • object
  • resource

Proposed Voting Choices

Yay or nay.

Patches and Tests

Coming soon ...




Pull Request

The competing proposal:

Alphanumeric Decrement

Rejected Features

Keep this updated with features that were discussed on the mail lists.

rfc/normalize_inc_dec.txt · Last modified: 2018/06/18 10:17 by cmb