Alexander Lisachenko a soumis une proposition de RFC pour étendre l'interface Foreign Function (FFI) de PHP avec un mappage optionnel des types de structures C vers les classes utilisateur.

L'implémentation FFI actuelle encapsule toutes les valeurs C – chaînes, objets, pointeurs primitifs – dans une seule classe finale FFI\CData. Ce type unifié préserve la flexibilité mais empêche les outils d'analyse statique et les IDE de vérifier les champs de structure, et les opérations instanceof ne peuvent pas fonctionner sur les types mappés. Les générateurs de liaisons FFI contournent actuellement cette limitation en livrant des classes stub, des fichiers de métadonnées IDE et des plugins d'analyseur, mais le résultat reste plus faible que le support natif.

La proposition de Lisachenko introduit un tableau d'options dans FFI::cdef() qui accepte une configuration de mappage de classe, associant les noms de types C aux noms de classes PHP :

```php $ffi = FFI::cdef($code, $lib, options: [ 'classmap' => [ 'zend_string' => \My\Engine\ZendString::class, ], ]); ```

Quand un type est enregistré, chaque poignée FFI créée pour lui – depuis FFI::new(), FFI::cast(), les lectures de champs de structure ou les retours de fonction – devient une instance de la classe mappée. Cela permet à get_class() de retourner le type correct, aux vérifications instanceof de fonctionner, et aux déclarations de paramètres et de types de retour natifs d'être appliquées.

L'implémentation reste locale à ext/ffi sans surcoût quand elle n'est pas utilisée. Le stockage d'objet reste la même structure zend_ffi_cdata avec des gestionnaires partagés ; seul le pointeur d'entrée de classe change. Le seul changement rompant la compatibilité est que FFI\CData devient extensible pour les classes enregistrées. Tous les changements sont rétrocompatibles et d'activation optionnelle.

La proposition mentionne également une typemap optionnelle pour les callbacks de marshalling personnalisés (from_cdata/to_cdata), bien que l'auteur sollicite des retours sur l'opportunité d'inclure cette fonctionnalité dans une première itération.

Lisachenko maintient le framework z-engine, qui émule déjà ces sémantiques dans l'espace utilisateur, fournissant un lit d'essai réel. Il cible PHP 8.6 et se propose de mettre en œuvre la fonctionnalité si les retours sont positifs.