Fonctions de rappels

Il est possible d'assigner une fermeture PHP à une variable native de type pointeur de fonction ou de la passer comme argument de fonction :

Exemple #1 Assignation d'une Closure PHP à un pointeur de fonction 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";
?>

L'exemple ci-dessus va afficher :

Hello World 1!
{
        Hello World 2!
}
Hello World 3!
Bien que cela fonctionne, cette fonctionnalité n'est pas supportée par toutes les plateformes libffi, n'est pas efficace et entraîne des fuites de ressources à la fin de la requête.
Astuce

Il est donc recommandé de minimiser l'utilisation des fonctions de rappels PHP.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top