Alexander Lisachenko ha presentado una propuesta de RFC para extender la interfaz Foreign Function (FFI) de PHP con mapeo opcional de tipos de estructuras C a clases de usuario.

La implementación FFI actual envuelve todos los valores C – cadenas, objetos, punteros primitivos – en una única clase final FFI\CData. Este tipo uniforme mantiene la flexibilidad pero impide que las herramientas de análisis estático e IDEs verifiquen campos de estructura, y las operaciones instanceof no pueden funcionar en tipos mapeados. Los generadores de enlaces FFI actualmente evitan esta limitación enviando clases stub, archivos de metadatos IDE y complementos de analizador, pero el resultado sigue siendo más débil que el soporte nativo.

La propuesta de Lisachenko introduce un array de opciones en FFI::cdef() que acepta configuración de mapeo de clase, asignando nombres de tipos C a nombres de clases PHP:

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

Cuando se registra un tipo, cada handle FFI creado para él – desde FFI::new(), FFI::cast(), lecturas de campos de estructura o retornos de función – se convierte en una instancia de la clase mapeada. Esto permite que get_class() retorne el tipo correcto, las comprobaciones instanceof funcionen, y se apliquen declaraciones de parámetros y tipos de retorno nativos.

La implementación permanece local en ext/ffi sin sobrecarga cuando no se utiliza. El almacenamiento de objetos sigue siendo la misma estructura zend_ffi_cdata con manejadores compartidos; solo cambia el puntero de entrada de clase. El único cambio que rompe la compatibilidad es que FFI\CData se vuelve extensible para clases registradas. Todos los cambios son retrocompatibles y de activación opcional.

La propuesta también menciona un typemap opcional para callbacks de marshalling personalizado (from_cdata/to_cdata), aunque el autor solicita comentarios sobre si incluir esta funcionalidad en una primera iteración.

Lisachenko mantiene el framework z-engine, que ya emula estas semánticas en espacio de usuario, proporcionando una base de pruebas real. Apunta a PHP 8.6 y se ofrece para implementar la funcionalidad si los comentarios son positivos.