Start · Sprachen · PHP · Referenz · uopz_set_property

uopz_set_property

Funktion

Setzt den Wert einer bestehenden statischen Klassen- oder Instanzeigenschaft zur Laufzeit, auch wenn sie <code>private</code> oder <code>protected</code> ist.

seit PHP 5.0.0 Kategorie: misc

Signatur

uopz_set_property(mixed $class, string $property, mixed $value): void

Beschreibung

uopz_set_property() gehört zur UOPZ-Erweiterung (User Operations for Zend) und ermöglicht es, den Wert einer Eigenschaft eines Objekts oder einer Klasse zur Laufzeit zu überschreiben – unabhängig von deren Sichtbarkeit (private, protected, public). Dies ist besonders im Testumfeld nützlich, wenn interner Zustand von Klassen für Unit-Tests präpariert werden muss, ohne den Produktionscode zu verändern.

Der Parameter class kann entweder ein Klassenname als String (für statische Eigenschaften) oder eine Objektinstanz (für Instanzeigenschaften) sein. Die Eigenschaft muss bereits existieren – uopz_set_property() legt keine neuen Eigenschaften an, sondern überschreibt bestehende.

Typische Anwendungsfälle sind das Setzen von Singleton-Instanzen, das Zurücksetzen von statischen Zählern oder das Einspielen von Test-Doubles in private Felder, auf die man über normale PHP-Mechanismen nicht zugreifen kann.

Achtung: UOPZ ist ausschließlich für Entwicklungs- und Testumgebungen gedacht und sollte niemals in Produktivumgebungen eingesetzt werden, da die Erweiterung tief in die Zend-Engine eingreift und unvorhersehbare Seiteneffekte verursachen kann.

Parameter

Name Typ Default Beschreibung
$class Pflicht object|string Entweder der Name einer Klasse als string (für statische Eigenschaften) oder eine Objektinstanz (für Instanzeigenschaften).
$property Pflicht string Der Name der zu setzenden Eigenschaft. Die Eigenschaft muss in der Klasse bereits deklariert sein.
$value Pflicht mixed Der neue Wert, der der Eigenschaft zugewiesen werden soll.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Instanzeigenschaft (private) zur Laufzeit setzen

<?php
class BankAccount
{
    private float $balance = 0.0;

    public function getBalance(): float
    {
        return $this->balance;
    }
}

$account = new BankAccount();

// Private Eigenschaft direkt setzen (z. B. für Tests)
uopz_set_property($account, 'balance', 250.75);

echo $account->getBalance(); // 250.75
250.75

Statische Klasseneigenschaft zurücksetzen

<?php
class RequestCounter
{
    private static int $count = 0;

    public static function increment(): void
    {
        self::$count++;
    }

    public static function getCount(): int
    {
        return self::$count;
    }
}

RequestCounter::increment();
RequestCounter::increment();
echo RequestCounter::getCount(); // 2

// Zähler für den nächsten Test zurücksetzen
uopz_set_property(RequestCounter::class, 'count', 0);

echo RequestCounter::getCount(); // 0
2 0

// Wichtig · Fallstricke

Nur für Test-/Entwicklungsumgebungen: Die UOPZ-Erweiterung manipuliert die Zend-Engine auf einer sehr tiefen Ebene. Der Einsatz in Produktivsystemen kann zu Instabilität, Speicherlecks und sicherheitskritischen Zuständen führen.

  • Die Eigenschaft muss in der Klasse oder einem ihrer Vorfahren bereits deklariert worden sein. Nicht-existente Eigenschaften können nicht über diese Funktion gesetzt werden – dafür ist uopz_set_property() nicht zuständig.
  • Bei Vererbung sollte darauf geachtet werden, dass die Eigenschaft in der richtigen Klasse angesprochen wird; UOPZ setzt die Eigenschaft in der Klasse, die sie deklariert hat.
  • Diese Funktion kann den Einsatz von Reflection (ReflectionProperty::setValue()) für Test-Setups ersetzen, ist jedoch noch direkter und weniger verbose.