In php-8 and older versions the following code works
class Foo {
public function __construct(string $string = null) {}
}
But in php-8, along with property promotion, it throws an error
class Foo {
public function __construct(private string $string = null) {}
}
Fatal error: Cannot use null as default value for parameter $string of type string
Making the string nullable works though
class Foo {
public function __construct(private ?string $string = null) {}
}
So is this a bug too or intended behaviour?
See the RFC for Constructor Property Promotion
...because promoted parameters imply a property declaration, nullability must be explicitly declared, and is not inferred from a null default value:
class Test { // Error: Using null default on non-nullable property public function __construct(public Type $prop = null) {} // Correct: Make the type explicitly nullable instead public function __construct(public ?Type $prop = null) {} }