PHP 8.3
Backward Incompatible Changes
PHP Core
Programs that were very close to overflowing the call stack
Programs that were very close to overflowing the call stack may now throw an Error when using more than zend.max_allowed_stack_size-zend.reserved_stack_size bytes of stack (fiber.stack_size-zend.reserved_stack_size for fibers).
Executing proc_get_status() multiple times
Executing proc_get_status() multiple times will now always
return the right value on POSIX systems. Previously, only the first call
of the function returned the right value. Executing
proc_close() after proc_get_status()
will now also return the right exit code. Previously this would return
-1
.
Internally, this works by caching the result on POSIX systems.
If the previous behaviour is required, it is possible to check the
"cached"
key in the array returned by
proc_get_status() to check whether the result was cached.
Zend Max Execution Timers
Zend Max Execution Timers is now enabled by default for ZTS builds on Linux.
Uses of traits with static properties
Uses of traits with static properties will now redeclare static properties inherited from the parent class. This will create a separate static property storage for the current class. This is analogous to adding the static property to the class directly without traits.
Assigning a negative index to an empty array
Assigning a negative index $n to an empty array will now make sure that the
next index is $n+1
instead of 0
.
Class constant visibility variance check
Class constant visibility variance is now correctly checked when inherited from interfaces.
WeakMap entries whose key maps to itself
WeakMap entries whose key maps to itself (possibly transitively) may now be removed during cycle collection if the key is not reachable except by iterating over the WeakMap (reachability via iteration is considered weak). Previously, such entries would never be automatically removed.
Date
The DateTime extension has introduced Date extension specific exceptions and errors under the DateError and DateException hierarchies, instead of warnings and generic exceptions. This improves error handling, at the expense of having to check for errors and exceptions.
DOM
Calling DOMChildNode::after(), DOMChildNode::before(), DOMChildNode::replaceWith() on a node that has no parent is now a no-op instead of a hierarchy exception, which is the behaviour demanded by the DOM specification.
Using the DOMParentNode
and DOMChildNode methods without a document now
works instead of throwing a DOM_HIERARCHY_REQUEST_ERR
DOMException.
This is in line with the behaviour demanded by the DOM specification.
Calling DOMDocument::createAttributeNS() without specifying a prefix would incorrectly create a default namespace, placing the element inside the namespace instead of the attribute. This bug is now fixed.
DOMDocument::createAttributeNS() would previously
incorrectly throw a DOM_NAMESPACE_ERRNAMESPACE_ERR
DOMException when the prefix was already used for a
different URI. It now correctly chooses a different prefix when there's a
prefix name conflict.
New methods and properties were added to some DOM classes. If a userland class inherits from these classes and declare a method or property with the same name, the declarations must be compatible. Otherwise, a typical compile error about incompatible declarations will be thrown. See the list of new features and new functions for a list of the newly implemented methods and properties.
FFI
C functions that have a return type of void now return null
instead of
returning the following object object(FFI\CData:void) { }
Opcache
The opcache.consistency_checks INI directive was removed. This feature was broken with the tracing JIT, as well as with inheritance cache, and has been disabled without a way to enable it since PHP 8.1.18 and PHP 8.2.5. Both the tracing JIT and inheritance cache may modify shm after the script has been persisted by invalidating its checksum. The attempted fix skipped over the modifiable pointers but was rejected due to complexity. For this reason, it was decided to remove the feature instead.
Phar
The type of Phar class constants are now declared.
Standard
The range() function has had various changes:
- A TypeError is now thrown when passing objects, resources, or arrays as the boundary inputs.
- A more descriptive ValueError is thrown when
passing
0
for$step
. - A ValueError is now thrown when using a
negative
$step
for increasing ranges. - If
$step
is a float that can be interpreted as an int, it is now done so. - A ValueError is now thrown if any argument is infinity or NAN.
- An
E_WARNING
is now emitted if$start
or$end
is the empty string. The value continues to be cast to the value0
. - An
E_WARNING
is now emitted if$start
or$end
has more than one byte, only if it is a non-numeric string. - An
E_WARNING
is now emitted if$start
or$end
is cast to an integer because the other boundary input is a number. (e.g.range(5, 'z');
). - An
E_WARNING
is now emitted if$step
is a float when trying to generate a range of characters, except if both boundary inputs are numeric strings (e.g.range('5', '9', 0.5);
does not produce a warning). - range() now produce a list of characters if one
of the boundary inputs is a string digit instead of casting the other input
to int (e.g.
range('9', 'A');
).
range('9', 'A'); // ["9", ":", ";", "<", "=", ">", "?", "@", "A"], as of PHP 8.3.0
range('9', 'A'); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], prior to PHP 8.3.0
?>
The file() flags error check now catches all invalid flags.
Notably FILE_APPEND
was previously silently accepted.
SNMP
The type of SNMP class constants are now declared.