Typed property must not be accessed before initialization" Fehler bei der Einführung von Eigenschaftstyphinweisen?

In PHP tritt der Fehler "Typed property must not be accessed before initialization" auf, wenn eine Eigenschaft mit einem Typhinweis definiert wird, aber sie vor der expliziten Zuweisung eines Werts aufgerufen wird.

Dieser Fehler kann behoben werden, indem entweder ein Standardwert für die Eigenschaft bereitgestellt wird oder indem die Eigenschaft innerhalb des Klassenkonstruktors initialisiert wird.

Hier ist ein Beispiel dafür, wie der Fehler durch Bereitstellen eines Standardwerts für die Eigenschaft behoben wird:

<?php

// Define a new class called MyClass
class MyClass
{
  /**
   * @var int
   */
  // Define a private property called "myProperty" and initialize it to 0
  private int $myProperty = 0;

  // Define a public method called "getMyProperty" that returns the value of "myProperty"
  public function getMyProperty(): int
  {
    return $this->myProperty;
  }

  // Define a public method called "setMyProperty" that takes an integer value and sets "myProperty" to that value
  public function setMyProperty(int $value): void
  {
    $this->myProperty = $value;
  }
}

// Create a new instance of MyClass called "myObject"
$myObject = new MyClass();

// Call the "getMyProperty" method on "myObject" and store the result in a variable called "value"
$value = $myObject->getMyProperty();

// Output the value of "value"
echo "The initial value of myProperty is: " . $value . "\n";

// Call the "setMyProperty" method on "myObject" and set "myProperty" to 42
$myObject->setMyProperty(42);

// Call the "getMyProperty" method on "myObject" again and store the result in "value"
$value = $myObject->getMyProperty();

// Output the new value of "value"
echo "The new value of myProperty is: " . $value . "\n";

Alternativ kann man es im Konstruktor initialisieren

<?php

class MyClass
{
  /**
   * @var int
   */
  private int $myProperty;

  public function __construct()
  {
    $this->myProperty = 0;
  }

  public function getMyProperty(): int
  {
    return $this->myProperty;
  }

  public function setMyProperty(int $value): void
  {
    $this->myProperty = $value;
  }
}

// Example usage
$obj = new MyClass();
echo $obj->getMyProperty() . PHP_EOL; // Output: 0
$obj->setMyProperty(42);
echo $obj->getMyProperty(); // Output: 42

Auf diese Weise kann der Interpreter die Eigenschaft bei der Instanziierung der Klasse mit dem Standardwert oder dem im Konstruktor gesetzten initialisieren und der Fehler wird behoben.