1--TEST-- 2FFI 200: PHP callbacks 3--SKIPIF-- 4<?php require_once('skipif.inc'); ?> 5<?php require_once('utils.inc'); ?> 6<?php 7try { 8 FFI::cdef("void* zend_write;", ffi_get_php_dll_name()); 9} catch (Throwable $e) { 10 die('skip PHP symbols not available'); 11} 12?> 13--INI-- 14ffi.enable=1 15--FILE-- 16<?php 17require_once('utils.inc'); 18$zend = FFI::cdef(" 19 typedef int (*zend_write_func_t)(const char *str, size_t str_length); 20 extern zend_write_func_t zend_write; 21", ffi_get_php_dll_name()); 22 23echo "Hello World!\n"; 24 25$orig_zend_write = clone $zend->zend_write; 26$zend->zend_write = function($str, $len) { 27 global $orig_zend_write; 28 $orig_zend_write("{\n\t", 3); 29 $ret = $orig_zend_write($str, $len); 30 $orig_zend_write("}\n", 2); 31 return $ret; 32}; 33echo "Hello World!\n"; 34$zend->zend_write = $orig_zend_write; 35 36echo "Hello World!\n"; 37?> 38--EXPECT-- 39Hello World! 40{ 41 Hello World! 42} 43Hello World! 44