The Daily Commit · Édition de rubrique La une PHP AI Dev EN DE FR ES

The Php Times

RFC Watch — Écosystème

Le mappage de structures FFI vers des classes PHP se rapproche d'un RFC formel


Alexander Lisachenko propose un mappage de classe optionnel pour l'interface Foreign Function de PHP, permettant aux types de structures C de se mapper sur les classes utilisateur.

PHP INTERNALS ([RFC]/[VOTE]), 12 août 2026 sélectionné par Heiko

La fonctionnalité activerait la vérification de type, le support IDE et les opérations instanceof sur les objets FFI tout en maintenant la compatibilité rétroactive via une implémentation sans surcoût.

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.

Lire la source originale (en anglais) ↗

Évaluer cet article : 0

Tribune des lecteurs

Pas encore de contributions — lance le débat.

← Écosystème — Page B1

"All the Code That's Fit to Ship" · The Daily Commit · Édition écran · Mentions légales · Politique de confidentialité