Signatur
Beschreibung
Componere\Value ist ein Wertobjekt aus der Componere-Extension, das verwendet wird, um Eigenschaften und Konstanten zu definieren, die zur Laufzeit einer Klasse hinzugefügt werden. Es kapselt den eigentlichen Wert sowie optionale Zugriffsmodifikatoren (Sichtbarkeit), sodass bei der dynamischen Klassenerweiterung präzise kontrolliert werden kann, wie eine Eigenschaft oder Konstante sich verhält.
Ein Value-Objekt wird typischerweise als Argument an Methoden wie Componere\Definition::addProperty() oder Componere\Definition::addConstant() übergeben. Der im Konstruktor angegebene PHP-Wert legt den Initialwert fest; er muss ein konstanter Ausdruck sein (also kein Ergebnis einer Funktion zur Laufzeit).
Über fluent-style-Methoden wie setProtected() und setPrivate() kann die Sichtbarkeit der Eigenschaft gesteuert werden. Standardmäßig ist ein Value öffentlich (public). Zusätzlich kann mit setStatic() eine statische Eigenschaft erzeugt werden.
Diese Klasse ist besonders nützlich beim dynamischen Patchen oder Erweitern bestehender Klassen in Test-Setups, Mocking-Frameworks oder Plugin-Architekturen, ohne den ursprünglichen Quellcode zu verändern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | mixed | Der Initialwert der Eigenschaft oder Konstante. Muss ein skalierbarer, statisch auswertbarer Wert sein (z. B. int, float, string, bool, null oder ein array mit konstanten Einträgen). |
Beispiele
Öffentliche Eigenschaft zur Laufzeit hinzufügen
<?php
use Componere\Definition;
use Componere\Value;
// Bestehende Klasse dynamisch erweitern
class OriginalClass {}
$def = new Definition(OriginalClass::class);
$def->addProperty('status', new Value('active'));
$def->register();
$obj = new OriginalClass();
echo $obj->status; // 'active'
Geschützte statische Eigenschaft mit Sichtbarkeitsmodifikator
<?php
use Componere\Definition;
use Componere\Value;
class ServiceBase {}
$def = new Definition(ServiceBase::class);
// Geschützte statische Eigenschaft
$value = (new Value(42))
->setProtected()
->setStatic();
$def->addProperty('instanceCount', $value);
$def->register();
// Zugriff via Reflection zur Überprüfung
$ref = new ReflectionProperty(ServiceBase::class, 'instanceCount');
echo $ref->isProtected() ? 'protected' : 'not protected'; // protected
echo PHP_EOL;
echo $ref->isStatic() ? 'static' : 'not static'; // static
Konstante zur Laufzeit definieren
<?php
use Componere\Definition;
use Componere\Value;
class Config {}
$def = new Definition(Config::class);
$def->addConstant('VERSION', new Value('1.0.0'));
$def->register();
echo Config::VERSION; // 1.0.0
// Wichtig · Fallstricke
Achtung: Die Componere-Extension ist keine Standard-PHP-Extension und muss separat installiert werden (z. B. via PECL: pecl install componere). Sie ist primär für PHP 7+ konzipiert; die Kompatibilität mit PHP 8.x sollte vor dem Einsatz geprüft werden.
Der übergebene Wert muss zur Compile-Zeit auswertbar sein. Dynamisch berechnete Werte (z. B. Rückgabewerte von Funktionen) sind nicht erlaubt und führen zu einem Fehler. Außerdem können bereits registrierte Definitionen nicht erneut verändert werden – register() ist endgültig.
Da Componere interne Zend-Strukturen manipuliert, kann der Einsatz in Produktivumgebungen zu unerwartetem Verhalten führen. Die Extension ist hauptsächlich für Test- und Entwicklungsszenarien gedacht.