Start · Sprachen · PHP · Referenz · FFI\CType

FFI\CType

Klasse

Repräsentiert die Typinformation einer C-Datenstruktur, die über die <code>FFI</code>-Erweiterung zugänglich gemacht wurde.

seit PHP 7.4.0 Kategorie: misc

Signatur

class FFI\CType

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;
Größe von Point: 16 Bytes Alignment von Point: 8 Bytes Klasse: FFI\CType

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;
Wert: 42 Typgröße: 4 Bytes Pointer-Typ: FFI\CType

// 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.