PHP 8.1: Passing
null to non-nullable internal function parameters is deprecated
In PHP, passing
null to a function/method parameter that is not declared nullable is not allowed. Prior to PHP 8.1, this restriction was only applied to user-land functions, and not internal functions.
From PHP 8.1, passing
null to a function/method parameter not declared nullable emits a deprecation notice. This is in preparation to remove this functionality to throw a
\TypeError exception in a future PHP version as it does already for user-land functions/methods.
strlen function expects the first parameter to be of type
string. By definition, it does not accept
null values (i.e. not declared as
string|null union type). For historical reasons, PHP allowed passing
null, for these parameters. This behavior is inconsistent from user-land functions/methods because they would have thrown a
\TypeError exception if
null is passed to a parameter type not declared as nullable.
strlen(null); // 0
Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in ... on line ...
This behavior was allowed in the first place for historical reasons. PHP 7.0's introduction of scalar types did not allow
null for parameters unless the parameter was explicitly declared nullable. However, internal functions were not changed to strictly enforce scalar types to ease upgrading to PHP 7.0.
In PHP 8.0, internal functions were updated to throw
\ValueError exceptions instead of warnings.
This deprecation notice will likely occur often in legacy code bases that relied on PHP to coerce the default value for a parameter from
null parameters to default values
Code that uses
null in a function/method call in place of the default value will need to replace the
null value with the default value from the function declaration.
For example, a
strlen(null) call emits a deprecation, and the sensible upgrade to this call would be
To bring another example,
preg_split function has a third parameter
int $limit = -1. Passing
null to this parameter emits a deprecation notice in PHP 8.1, and the sensible upgrade to this call would be setting
$limit parameter to
Backwards Compatibility Impact
This is a backwards-compatibility breaking change. Updating the
null parameters to adhere to the expected type should fix the deprecation notice across all PHP versions.
Further, it may be possible for automated code fixing tools to update said
null parameters to the default values from the function declaration.