Start · Sprachen · PHP · Referenz · com_safearray_proxy

com_safearray_proxy

Klasse

Interne Hilfsklasse zur transparenten Auflösung von Zugriffen auf mehrdimensionale <code>SAFEARRAY</code>-Typen in COM-Objekten.

seit PHP 5.0.0 Kategorie: misc

Signatur

class com_safearray_proxy

Beschreibung

com_safearray_proxy ist eine interne PHP-Klasse, die automatisch erzeugt wird, wenn auf ein mehrdimensionales SAFEARRAY aus einem COM-Objekt zugegriffen wird. Sie stellt einen Proxy-Mechanismus bereit, über den PHP-Code die Elemente eines solchen Arrays schrittweise traversieren kann, ohne dass der gesamte Speicherinhalt sofort in eine PHP-Datenstruktur kopiert werden muss.

Ein SAFEARRAY ist ein in Microsoft COM/OLE weit verbreiteter Datentyp, der typisierte, mehrdimensionale Arrays beschreibt. Wenn ein COM-Objekt (z. B. eine Excel- oder ADO-Instanz) ein solches Array zurückliefert, kapselt PHP den Zugriff automatisch in einem com_safearray_proxy-Objekt, sodass der Entwickler über die gewohnte Array-Syntax auf die Inhalte zugreifen kann.

Diese Klasse wird nicht direkt instanziiert; sie entsteht implizit, sobald PHP-Code auf ein COM-Property oder eine Methode zugreift, die ein mehrdimensionales SAFEARRAY liefert. Sie ist ausschließlich unter Windows im Zusammenspiel mit der COM-Erweiterung verfügbar.

Typische Anwendungsgebiete sind der Zugriff auf Excel-Zellbereiche, ADO-Recordset-Felder oder andere OLE-Automation-Objekte, die Arrays als SAFEARRAY-Varianten zurückgeben. Der Entwickler sollte sich bewusst sein, dass com_safearray_proxy nur als Durchgangsschicht fungiert und nicht für eigenständige Operationen gedacht ist.

Beispiele

Zugriff auf ein Excel-Zellbereich-SAFEARRAY via COM

<?php
// Voraussetzung: Windows, COM-Erweiterung aktiviert, Excel installiert
$excel = new COM('Excel.Application');
$excel->Visible = false;

$workbooks = $excel->Workbooks->Open('C:\\test.xlsx');
$sheet = $workbooks->Sheets(1);

// Range->Value2 kann ein mehrdimensionales SAFEARRAY zurückliefern
$range = $sheet->Range('A1:C3');
$safeArray = $range->Value2; // Liefert ein com_safearray_proxy-Objekt

// Zugriff auf Elemente über Array-Syntax (1-basierter Index bei Excel)
echo $safeArray[1][1]; // Zelle A1
echo $safeArray[2][3]; // Zelle C2

$excel->Quit();
unset($excel);
?>

Iteration über ein SAFEARRAY-Proxy-Objekt

<?php
// Annahme: $safeArray ist ein durch COM zurückgegebenes com_safearray_proxy
// z. B. aus einem ADO-Recordset oder Excel-Range

// Konvertierung in ein normales PHP-Array
function safeArrayToPhpArray($proxy): array {
    $result = [];
    foreach ($proxy as $row) {
        if ($row instanceof com_safearray_proxy) {
            $result[] = safeArrayToPhpArray($row);
        } else {
            $result[] = $row;
        }
    }
    return $result;
}

// $safeArray wurde zuvor von einem COM-Objekt geliefert
// $phpArray = safeArrayToPhpArray($safeArray);
// print_r($phpArray);
?>

// Wichtig · Fallstricke

Nur unter Windows verfügbar: com_safearray_proxy ist ausschließlich Teil der Windows-spezifischen COM-Erweiterung (ext/com_dotnet) und steht auf Linux/macOS nicht zur Verfügung.

Nicht manuell instanziieren: Die Klasse ist intern und sollte niemals direkt per new com_safearray_proxy() erzeugt werden. Jede direkte Nutzung außerhalb des COM-Erweiterungs-Kontexts ist undefiniertes Verhalten.

Indexierung: Viele COM-Objekte (insbesondere Office-Anwendungen) verwenden 1-basierte Indizes für SAFEARRAY-Zugriffe. Dies weicht vom üblichen PHP-Verhalten (0-basiert) ab und kann zu Verwirrung führen.

Speicher: Bei großen Arrays (z. B. umfangreiche Excel-Bereiche) kann die Konvertierung in PHP-Arrays erhebliche Speichermengen beanspruchen. Es empfiehlt sich, nur die tatsächlich benötigten Teilbereiche abzurufen.