On Mon, Oct 23, 2023, at 2:18 PM, Pierre wrote: > Hello internals, > > I stumbled upon this behavior, if I write this: > > ```php > class Foo > { > public ?string $prop = null; > > public function __construct(?string $prop = null) > { > $this->prop = $prop; > } > } > > class Bar extends Foo > { > public function __construct( > public ?string $bar = null, > ) {} > } > > // Echoes nothing, but it works as expected. > echo (new Bar())->prop; > ``` > > It works as intended, but if I replace the `Foo` class using: > > ```php > class Foo > { > public function __construct( > public ?string $prop = null, > ) {} > } > ``` > > It won't work anymore and I have the following error: > > ``` > PHP Warning: Uncaught Error: Typed property Foo::$prop must not be > accessed before initialization in php shell code:9 > ``` > > If I understand it correctly: > - in the first case, default value is attached to the object property, > so if I omit its constructor, I have the default, > - in the second case, default value is attached to the constructor > parameter, and not to the object property, which means that in case the > parent constructor is not called in the `Bar` class, `$prop` remains > initialized. > > It doesn't sound like a bug, but I think that many people would actually > expect otherwise: that the constructor promoted property keep their > default even when constructor is not explicitly called. > > Is there any good reason behind this ? Wouldn't it be best to change > this behavior ? Would it be a risk for backward compatibility (my guess > is "not that much, probably not a all even") ?
Where this becomes a problem is readonly properties, since those are not allowed to have default values. (That would make them constants with worse performance.) A solution would need to be able to detect that the parent::__construct() isn't called, and then call it anyway, or at least partially call it. Unfortunately, I can think of many cases where such a call would result in unexpected behavior. It might be possible to resolve, but it's definitely not simple, and it could easily lead to weird behavior. --Larry Garfield -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php