PHPCon Poland 2024

FFI::load

(PHP 7 >= 7.4.0, PHP 8)

FFI::loadCharge les déclarations C à partir d'un fichier d'en-tête C

Description

public static FFI::load(string $filename): ?FFI

Charge les déclarations C à partir d'un fichier d'en-tête C. Il est possible de spécifier les bibliothèques partagées qui doivent être chargées, en utilisant des définitions spéciales FFI_LIB dans le fichier d'en-tête C chargé.

Liste de paramètres

filename

Le nom d'un fichier d'en-tête C.

Les directives du préprocesseur C ne sont pas supportées, c'est-à-dire #include, #define et les macros CPP ne fonctionnent pas, sauf dans les cas particuliers énumérés ci-dessous.

Le fichier d'en-tête devrait contenir une déclaration #define pour la variable FFI_SCOPE, par exemple : #define FFI_SCOPE "MYLIB". Reportez-vous à l'introduction de la classe pour plus de détails.

Le fichier d'en-tête peut contenir une déclaration #define pour la variable FFI_LIB pour spécifier la bibliothèque qu'elle expose. S'il s'agit d'une bibliothèque système, seul le nom du fichier est requis, par exemple : #define FFI_LIB "libc.so.6". S'il s'agit d'une bibliothèque personnalisée, un chemin relatif est requis, par exemple : #define FFI_LIB "./mylib.so".

Valeurs de retour

Retourne l'objet FFI fraîchement créé, ou null en cas d'échec.

Voir aussi

  • FFI::scope() - Instancie un objet FFI avec les déclarations C analysées lors du préchargement

add a note

User Contributed Notes 2 notes

up
9
jungmann0 at gmail dot com
3 years ago
Since #include's and #define's other than FFI_LIB and FFI_SCOPE are not supported in the header, you may want to use the C preprocessor to pre-process your headers in order to resolve all #include's and macros.

I use -D"__attribute__(ARGS)=" to remove function attributes as well, which are not supported by FFI either.

This is my script:

echo '#define FFI_SCOPE "YOUR_SCOPE"' > header-ffi.h
echo '#define FFI_LIB "/path/to/your_lib.so"' >> header-ffi.h
cpp -P -C -D"__attribute__(ARGS)=" header_original >> header-ffi.h
up
2
ojrask at gmail dot com
4 years ago
Regarding the `FFI_LIB` constant:

The path given can be either relative, or absolute, or then refer to a library that is in your global libraries path (i.e. where libc.so.6 and friends are).

The absolute path and global lib path work as expected. The relative path does not work from the header file path, but the current working directory instead. So when you create header files for FFI usage, remember that the PHP script can be called anywhere and this means any relative paths in `FFI_LIB` will most probably fail.

Not sure if there is some possibility to make it use paths relative to the script being called, or relative to the header file being loaded. That would make more sense to me at least.

Right now `FFI_LIB` is quite unusable when it comes to making FFI-powered PHP packages that can be installed literally anywhere on a system. `FFI::cdef` works just as well, but `FFI::scope` also seems to rely on `FFI_LIB` meaning it will fail with relative paths as well.

I guess this comes from the C function `dlopen` as is.
To Top