Implicitly marking parameter $%s as nullable is deprecated, the explicit nullable type must be used instead

Description

Until PHP 8.4, it is possible to use a default value of null, on a parameter that is not nullable. This special situation makes the parameter nullable: it may be omitted, or explicitly passed as null. This is a hidden type, as the null type is not explicit, yet it is fully usable.

In PHP 8.4, this is not possible anymore. For consistency reasons, the type must be explicitly displayed. Until then, it was silent.

Example

<?php

function foo(string $s = null) {}

class X {
    function foo(string $s = null) {}
}

?>

Literal Examples

  • foo(): Implicitly marking parameter $s as nullable is deprecated, the explicit nullable type must be used instead

  • X::bar(): Implicitly marking parameter $s as nullable is deprecated, the explicit nullable type must be used instead

Solutions

  • Add ? to the type.

  • Add null| to the type.

  • Use a default value in the range of the specified type.

Changed Behavior

This error may appear following an evolution in behavior, in previous versions. See implicitNullable.

Static Analysis

This error may be tracked down with the following static analysis rules: Classes/HiddenNullable.