Sobes.tech
Middle

Bedeutet dies, dass die Klasse unveränderlich ist, wenn sie eine öffentliche Eigenschaft hat?

sobes.tech KI

Antwort von AI

Nein.

Eine öffentliche Eigenschaft in einer Klasse bedeutet, dass der Wert dieser Eigenschaft von außerhalb des Objekts geändert werden kann. Ein unveränderliches Objekt ist eines, dessen Zustand (Werte seiner Eigenschaften) nach der Erstellung nicht geändert werden kann. Das Vorhandensein einer öffentlichen Eigenschaft widerspricht dem Prinzip der Unveränderlichkeit.

Um Unveränderlichkeit zu erreichen, muss die Klasse die folgenden Bedingungen erfüllen:

  • Alle Eigenschaften müssen privat (private) oder geschützt (protected) sein.
  • Es dürfen keine Setter (Methoden, die die Werte der Eigenschaften ändern) vorhanden sein.
  • Alle Abhängigkeiten (Objekte, mit denen die Klasse arbeitet) müssen ebenfalls unveränderlich sein oder ihr Zustand darf von außen nicht geändert werden.
  • Der Konstruktor muss das Objekt vollständig initialisieren und darf nach der Erstellung nicht geändert werden.
  • Wenn Änderungen erforderlich sind, müssen neue Instanzen des Objekts mit den neuen Werten erstellt werden.

Beispiel einer Klasse mit einer öffentlichen Eigenschaft (mutable):

<?php
class MutableObject
{
    public $value; // Öffentliche Eigenschaft

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

$obj = new MutableObject(10);
echo $obj->value; // 10

$obj->value = 20; // Wert wurde von außen geändert
echo $obj->value; // 20

Beispiel einer Implementierung einer unveränderlichen Klasse:

<?php
class ImmutableObject
{
    private $value; // Private Eigenschaft

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

    public function getValue() : int
    {
        return $this->value;
    }

    // Methode zum "Ändern", erstellt tatsächlich ein neues Objekt
    public function withValue(int $newValue) : self
    {
        return new self($newValue);
    }
}

$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10

// $obj1->value = 20; // Fehler: Zugriff auf private Eigenschaft nicht möglich

$obj2 = $obj1->withValue(20); // Es wird ein neues Objekt erstellt
echo $obj1->getValue(); // 10 (das ursprüngliche Objekt hat sich nicht geändert)
echo $obj2->getValue(); // 20 (neues Objekt mit geändertem Wert)