Start · Sprachen · PHP · Referenz · Componere\cast_by_ref

Componere\cast_by_ref

Funktion

Wandelt ein bestehendes Objekt per Referenz in den durch eine <code>Componere\Definition</code> definierten Typ um, ohne das Objekt zu kopieren.

Kategorie: oop

Signatur

Componere\cast_by_ref(Componere\Definition $definition, object &$object): object

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

Typ
object
Beschreibung
Gibt das per Referenz umgewandelte Objekt zurück, das nun dem durch 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
Hallo, Welt! 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
verschieden gleich 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.