Funciones de retrollamada

Es posible asignar una clausura PHP a una variable nativa de tipo puntero de función o pasarla como argumento de función:

Ejemplo #1 Asignación de una Closure PHP a un puntero de función C

<?php
$zend = FFI::cdef("
    typedef int (*zend_write_func_t)(const char *str, size_t str_length);
    extern zend_write_func_t zend_write;
");

echo "Hello World 1!\n";

$orig_zend_write = clone $zend->zend_write;
$zend->zend_write = function($str, $len) {
    global $orig_zend_write;
    $orig_zend_write("{\n\t", 3);
    $ret = $orig_zend_write($str, $len);
    $orig_zend_write("}\n", 2);
    return $ret;
};
echo "Hello World 2!\n";
$zend->zend_write = $orig_zend_write;
echo "Hello World 3!\n";
?>

El ejemplo anterior mostrará:

Hello World 1!
{
        Hello World 2!
}
Hello World 3!
Aunque esto funciona, esta funcionalidad no es soportada por todas las plataformas libffi, no es eficiente y provoca fugas de recursos al final de la petición.
Sugerencia

Por lo tanto, se recomienda minimizar el uso de las funciones de retrollamada PHP.