ffi-php-examples-callback-1

  • Examples
  • PHP Callbacks

  • PHP Callbacks
  • PHP Callbacks

    PHP Callbacks

    It is possible to assign a PHP closure to a native
    variable of function pointer type or to pass it as a function
    argument:

    <?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";
    ?>

    The above example will output:

    Hello World 1!
    {
            Hello World 2!
    }
    Hello World 3!
    

    Although this works, this functionality is not supported on all
    libffi platforms, is not efficient and leaks resources by the end
    of request.

    Tip

    It is therefore recommended to minimize the
    usage of PHP callbacks.