Start · Sprachen · PHP · Referenz · LuaClosure

LuaClosure

Klasse

Repräsentiert eine Lua-Closure, die aus der Lua-Erweiterung (<code>lua</code>) nach PHP übertragen wurde.

Kategorie: misc

Signatur

class LuaClosure

Beschreibung

LuaClosure ist eine interne PHP-Klasse der Lua-PECL-Erweiterung und wird automatisch erzeugt, wenn ein Lua-Funktionsobjekt (Closure) aus der Lua-VM an PHP zurückgegeben wird. Sie kann nicht direkt im PHP-Userland instanziiert werden.

Wenn ein Lua-Skript eine Funktion zurückgibt – etwa durch return function() ... end – erhält PHP-Code ein LuaClosure-Objekt statt eines einfachen Wertes. Dieses Objekt kann anschließend aus PHP heraus aufgerufen werden, um die zugehörige Lua-Funktion auszuführen.

LuaClosure-Objekte verhalten sich in PHP ähnlich wie Closure-Objekte: Sie können als Callable übergeben und mit call_user_func() oder direkt als $closure() aufgerufen werden. Argumente werden dabei automatisch zwischen PHP und Lua konvertiert.

Die Klasse ist eng an den Lebenszyklus des zugehörigen Lua-Objekts geknüpft. Wird das Lua-Objekt zerstört, ist das LuaClosure-Objekt nicht mehr sinnvoll verwendbar.

Beispiele

Lua-Closure aus einem Lua-Skript aufrufen

<?php
// Voraussetzung: PECL-Erweiterung 'lua' ist installiert
$lua = new Lua();

// Lua-Skript gibt eine Funktion zurück
$luaClosure = $lua->eval(<<<LUA
    return function(a, b)
        return a + b
    end
LUA);

var_dump($luaClosure instanceof LuaClosure); // bool(true)

// LuaClosure direkt aus PHP aufrufen
$result = $luaClosure(3, 7);
echo $result; // 10
bool(true) 10

LuaClosure als Callable weitergeben

<?php
$lua = new Lua();

$double = $lua->eval(<<<LUA
    return function(x)
        return x * 2
    end
LUA);

$numbers = [1, 2, 3, 4, 5];
$doubled = array_map($double, $numbers);

print_r($doubled);
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 )

// Wichtig · Fallstricke

Verfügbarkeit: LuaClosure steht nur zur Verfügung, wenn die PECL-Erweiterung lua installiert und geladen ist. Sie ist kein Bestandteil des PHP-Kerns.

Lebenszyklus: Das LuaClosure-Objekt ist intern an das Lua-Objekt gebunden. Wird das Lua-Objekt vorzeitig freigegeben (z. B. durch unset()), kann der Aufruf der Closure zu undefiniertem Verhalten oder einem Fehler führen.

Typkonvertierung: PHP-Werte werden beim Aufruf automatisch in Lua-Typen konvertiert und umgekehrt. Nicht alle PHP-Typen (z. B. Ressourcen, komplexe Objekte) lassen sich verlustfrei übertragen.

Siehe auch