Signatur
Beschreibung
FFI\CType ist eine interne PHP-Klasse, die den Typ einer C-Datenstruktur beschreibt. Objekte dieser Klasse werden nicht direkt instanziiert, sondern entstehen implizit beim Parsen von C-Deklarationen über FFI::cdef(), FFI::load() oder FFI::type(). Sie kapseln Metainformationen über C-Typen wie int, struct, pointer, array oder benutzerdefinierte Typen aus geladenen Bibliotheken.
Mit FFI\CType-Objekten lassen sich Informationen über einen C-Typ abfragen, z. B. seine Größe in Bytes, seine Ausrichtung (Alignment) oder seine Art (Kind). Diese Metadaten sind essentiell, wenn man dynamisch C-Speicher allokieren, Strukturen inspizieren oder typsichere Pointer erzeugen möchte. Die Methoden der Klasse ermöglichen somit eine reflexionsartige Inspektion von C-Typen direkt aus PHP.
Typische Einsatzfelder sind das Arbeiten mit nativen Bibliotheken (z. B. über FFI::load()), bei denen Größen- und Alignment-Informationen zur Laufzeit benötigt werden — etwa beim Aufbau von binären Protokollen, beim Lesen von Shared Memory oder bei der Entwicklung von Wrapper-Bibliotheken um C-APIs.
Da FFI\CType keine öffentlichen Konstruktoren besitzt, sollte die Klasse ausschließlich über die entsprechenden FFI-Methoden verwendet werden. Direkte Instanziierung führt zu einem Fehler.
Beispiele
Typinformationen eines C-Structs abfragen
<?php
// FFI-Kontext mit einem einfachen C-Struct erstellen
$ffi = FFI::cdef('
typedef struct {
int x;
int y;
double z;
} Point;
');
// CType-Objekt für den Struct-Typ abrufen
$type = $ffi->type('Point');
// Größe und Alignment des Typs ausgeben
echo 'Größe von Point: ' . FFI::sizeof($type) . ' Bytes' . PHP_EOL;
echo 'Alignment von Point: ' . FFI::alignof($type) . ' Bytes' . PHP_EOL;
echo 'Klasse: ' . get_class($type) . PHP_EOL;
Pointer-Typ erstellen und Typinformation prüfen
<?php
// FFI-Kontext laden
$ffi = FFI::cdef('
typedef struct { uint32_t value; } MyData;
');
// CType für MyData ermitteln
$dataType = $ffi->type('MyData');
// Neues CData-Objekt auf Basis des Typs erzeugen
$data = FFI::new($dataType);
$data->value = 42;
echo 'Wert: ' . $data->value . PHP_EOL;
echo 'Typgröße: ' . FFI::sizeof($dataType) . ' Bytes' . PHP_EOL;
// Pointer auf das CData-Objekt erzeugen
$ptr = FFI::addr($data);
echo 'Pointer-Typ: ' . get_class(FFI::typeof($ptr)) . PHP_EOL;
// Wichtig · Fallstricke
Keine direkte Instanziierung: FFI\CType-Objekte können nicht mit new FFI\CType() erstellt werden. Sie entstehen ausschließlich als Rückgabewerte von Methoden wie FFI::type() oder FFI::typeof().
Sicherheit: Die FFI-Erweiterung erlaubt direkten Zugriff auf nativen Speicher. Fehler bei der Verwendung von C-Typen (z. B. falsche Größen oder Ausrichtungen) können zu Speicherzugriffsfehlern (Segmentation Faults) oder undefiniertem Verhalten führen. FFI sollte nur mit vertrauenswürdigem Code verwendet werden.
Verfügbarkeit: Die FFI-Erweiterung muss in der PHP-Konfiguration aktiviert sein (extension=ffi in der php.ini). Außerdem muss ffi.enable auf true oder preload gesetzt sein, da FFI aus Sicherheitsgründen standardmäßig deaktiviert ist.
Methoden wie FFI::sizeof(), FFI::alignof() und FFI::typeof() akzeptieren sowohl FFI\CType- als auch FFI\CData-Objekte als Argument.