$reflectionPromotedProperty->hasDefaultValue()



final class A

{

public function __construct(

public string $a = 'default',

) {}

}

$property = new ReflectionProperty(A::class, 'a');

var_dump($property->hasDefaultValue()); // false



Довольно контринтуитивно, что этот код выведет false.



Однако если развернуть promoted свойство в обычное, станет понятно, почему:



final class A

{

public string $a;



public function __construct(

string $a = 'default',

) {

$this->a = $a;

}

}

$parameter = new ReflectionParameter([A::class, '__construct'], 'a');

var_dump($parameter->isDefaultValueAvailable()); // true



Дефолтное значение имеет не свойство, а параметр конструктора!

Как следствие, вот такой код



$class = new ReflectionClass(A::class);

$a = $class->newInstanceWithoutConstructor();

var_dump($a->a);



выбросит Typed property A::$a must not be accessed before initialization.



https://3v4l.org/kkf24