Signatur
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
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
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
// 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.