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