It is possible to assign a PHP closure to a native variable of function pointer type or to pass it as a function argument:
Example #1 Assigning a PHP Closure to a C function pointer
<?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!
It is therefore recommended to minimize the usage of PHP callbacks.