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.
Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.