Signatur
Beschreibung
Componere\cast_by_ref ist Teil der Componere-Erweiterung und ermöglicht es, ein bestehendes Objekt per Referenz in einen neuen, durch eine Componere\Definition beschriebenen Typ umzuwandeln. Im Gegensatz zu Componere\cast wird das Originalobjekt direkt verändert, statt eine Kopie anzulegen – das ist effizienter bei großen Objekten oder wenn der Aufrufer immer auf dasselbe Objekt zeigen soll.
Die übergebene Componere\Definition beschreibt die Klasse, in die das Objekt umgewandelt werden soll, inklusive zusätzlicher Methoden und Eigenschaften, die der Zielklasse hinzugefügt werden können. Das Originalobjekt behält seine bestehenden Eigenschaften; neue Methoden aus der Definition werden in den Typ eingebunden.
Typisches Einsatzgebiet ist das nachträgliche Erweitern oder Ändern von Objekt-Typen zur Laufzeit, etwa in Test-Frameworks, Mocking-Bibliotheken oder dynamischen Plugin-Architekturen, wo Klassen ohne Vererbung erweitert werden sollen.
Wichtig: Diese Funktion erfordert die PECL-Erweiterung componere und ist kein Bestandteil der PHP-Standardbibliothek. Sie sollte nur dann eingesetzt werden, wenn die Manipulation der Objektidentität zur Laufzeit explizit gewünscht ist, da sie das Typsystem von PHP gezielt umgeht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $definition Pflicht | Componere\Definition | Eine Componere\Definition-Instanz, die den Zieltyp beschreibt, in den das Objekt umgewandelt werden soll. Die Definition kann zusätzliche Methoden und Eigenschaften enthalten. |
|
| $object Pflicht | object | Das Objekt, das per Referenz umgewandelt werden soll. Das Originalobjekt wird direkt modifiziert – es wird keine Kopie erstellt. |
Rückgabewert
Componere\Definition beschriebenen Typ entspricht.Beispiele
Objekt per Referenz in neuen Typ umwandeln
<?php
use Componere\Definition;
use function Componere\cast_by_ref;
class Basis {
public string $name = 'Welt';
}
$objekt = new Basis();
$definition = new Definition(Basis::class);
$definition->addMethod('greet', new \Closure(function(): string {
return 'Hallo, ' . $this->name . '!';
}));
$umgewandelt = cast_by_ref($definition, $objekt);
// $objekt und $umgewandelt zeigen jetzt auf dasselbe Objekt
echo $umgewandelt->greet(); // Hallo, Welt!
echo ($objekt === $umgewandelt) ? 'gleich' : 'verschieden'; // gleich
Unterschied zu cast: Referenz-Semantik prüfen
<?php
use Componere\Definition;
use function Componere\cast_by_ref;
use function Componere\cast;
class Produkt {
public int $preis = 100;
}
$p1 = new Produkt();
$p2 = new Produkt();
$def = new Definition(Produkt::class);
$def->addMethod('rabatt', new \Closure(function(): int {
return (int)($this->preis * 0.9);
}));
// cast erstellt Kopie
$kopie = cast($def, $p2);
echo ($p2 === $kopie) ? 'gleich' : 'verschieden'; // verschieden
echo PHP_EOL;
// cast_by_ref verändert $p1 direkt
$ref = cast_by_ref($def, $p1);
echo ($p1 === $ref) ? 'gleich' : 'verschieden'; // gleich
echo PHP_EOL;
echo $ref->rabatt(); // 90
// Wichtig · Fallstricke
Achtung: Componere\cast_by_ref umgeht das normale PHP-Typsystem und sollte nur in kontrollierten Umgebungen wie Tests oder Frameworks verwendet werden. Der Einsatz in produktivem Anwendungscode kann zu schwer nachvollziehbarem Verhalten führen, insbesondere bei Typprüfungen mit instanceof oder Reflection.
Die Funktion setzt voraus, dass die PECL-Erweiterung componere installiert und geladen ist. Sie ist nicht Bestandteil der PHP-Kerninstallation.
Da das Objekt direkt per Referenz verändert wird, können andere Stellen im Code, die eine Referenz auf dasselbe Objekt halten, unbemerkt beeinflusst werden – dies ist ein bewusster, aber potenziell gefährlicher Effekt.