Article

Migrating from PHP 8.2 to PHP 8.3

PHP 8.3 upgrade notes highlighting range() changes, negative array index behavior, Date exceptions, and stack-size guards.

PHP 8.3 remains in security support until 2027-12-31 (verified 2026-08-09). Most 8.2 applications move cleanly; the breaks that bite are subtle. Official: migration83 incompatible.

range() behavior

range() gained stricter validation and changed some string/number boundary cases. Example called out by php.net: range('9', 'A') now yields characters through the ASCII range rather than integers down to 0.

# Verify any range() used for identifiers, letters, or mixed boundaries
$letters = range('9', 'A'); // 8.3: ['9', ':', ..., 'A']

Negative indexes on empty arrays

Assigning a negative index $n to an empty array now makes the next implicit index $n+1 instead of 0. Audit append loops that previously assumed a reset to zero.

Date extension exceptions

Date operations increasingly throw Date-specific exceptions/errors instead of warnings. Catch narrowly in parsers that previously ignored bad input.

proc_get_status caching

Multiple calls to proc_get_status() on POSIX now return consistent cached results; proc_close() exit codes align. Process wrappers may need updates if they depended on the old “first call wins” quirk.

Run compatibility checker and full suite under 8.3 before promoting. Next: 8.3→8.4.

Related scanners: PHP Version Compatibility Checker · PHP Deprecated Checker.

Related reading