Обложка канала

Пых

4468 @phpyh

Блог @vudaltsov о разработке на PHP

Пых

4 года назад
Открыть в
$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