web-dev-qa-db-fra.com

Pourquoi j'obtiens soudainement une erreur "La propriété typée ne doit pas être accédée avant l'initialisation" lors de l'introduction d'indications de type de propriétés?

J'ai mis à jour mes définitions de classe pour utiliser les conseils de type de propriété nouvellement introduits, comme ceci:

class Foo {

    private int $id;
    private ?string $val;
    private DateTimeInterface $createdAt;
    private ?DateTimeInterface $updatedAt;

    public function __construct(int $id) {
        $this->id = $id;
    }


    public function getId(): int { return $this->id; }
    public function getVal(): ?string { return $this->val; }
    public function getCreatedAt(): ?DateTimeInterface { return $this->createdAt; }
    public function getUpdatedAt(): ?DateTimeInterface { return $this->updatedAt; }

    public function setVal(?string $val) { $this->val = $val; }
    public function setCreatedAt(DateTimeInterface $date) { $this->createdAt = $date; }
    public function setUpdatedAt(DateTimeInterface $date) { $this->updatedAt = $date; }
}

Mais en essayant de sauvegarder mon entité sur Doctrine, j'obtiens une erreur disant:

La propriété typée ne doit pas être accédée avant l'initialisation

Cela ne se produit pas seulement avec $id ou $createdAt, mais cela arrive aussi avec $value ou $updatedAt, qui sont des propriétés Nullable.

19
yivi

Pour les propriétés typées Nullable, vous devez utiliser la syntaxe

private ?string $val = null;

sinon, il génère une erreur fatale.

Puisque ce concept conduit à des erreurs fatales inutiles, j'ai créé un rapport de bogue https://bugs.php.net/bug.php?id=7962 - sans succès, mais au moins j'ai essayé. ..

0
Hhyperion