Start · Sprachen · PHP · Referenz · uopz_flags

uopz_flags

Funktion

Liest oder setzt die internen Zend-Flags einer Funktion oder Methode zur Laufzeit.

seit PHP 5.0.2 Kategorie: misc

Signatur

uopz_flags(string $function, int $flags = PHP_INT_MAX): int

Beschreibung

uopz_flags ist Teil der UOPZ-Extension (User Operations for Zend) und ermöglicht es, die internen Flags (sogenannte Zend function flags) einer PHP-Funktion oder -Methode zur Laufzeit zu lesen oder zu überschreiben. Damit lassen sich beispielsweise Funktionen als abstrakt, final oder als interne Funktion markieren – ohne den Quellcode zu verändern.

Die Funktion existiert in zwei Varianten: Wird nur der Funktionsname übergeben, liefert sie die aktuellen Flags zurück. Wird zusätzlich ein $flags-Wert übergeben (der kein PHP_INT_MAX ist), werden die Flags auf diesen Wert gesetzt. Für Methoden existiert eine überladene Variante mit drei Parametern: uopz_flags(string $class, string $function, int $flags).

Typische Einsatzszenarien sind Unit-Tests, bei denen das Verhalten von Funktionen oder Klassen manipuliert werden muss, ohne deren Implementierung zu ändern. So kann z. B. eine Klasse als final markiert oder diese Markierung entfernt werden, um Mocking zu ermöglichen.

Achtung: Diese Funktion arbeitet direkt auf den internen Zend-Strukturen. Sie ist ausschließlich für Test- und Debugging-Zwecke gedacht und sollte niemals in produktivem Code verwendet werden.

Parameter

Name Typ Default Beschreibung
$class string Optionaler Klassenname, wenn Flags einer Methode oder der Klasse selbst gelesen/gesetzt werden sollen. Wird dieser Parameter angegeben, muss auch function als zweiter Parameter folgen.
$function Pflicht string Name der Funktion oder Methode, deren Flags gelesen oder gesetzt werden sollen. Bei Klassen-Flags (z. B. final auf Klassenebene) kann hier ein leerer String übergeben werden.
$flags int PHP_INT_MAX Die neuen Flags als Integer. Wird PHP_INT_MAX übergeben (Standardwert), werden die Flags nur gelesen und nicht verändert. Gültige Werte sind Zend-interne Konstanten wie ZEND_ACC_FINAL, ZEND_ACC_ABSTRACT usw.

Rückgabewert

Typ
int
Beschreibung
Gibt die aktuellen (alten) Flags der Funktion oder Methode als Integer zurück. Beim Lesen entspricht dies den aktuell gesetzten Flags; beim Setzen werden die vorherigen Flags zurückgegeben.

Beispiele

Flags einer Funktion lesen

<?php
// Aktuelle Flags der eingebauten Funktion 'strlen' lesen
$flags = uopz_flags('strlen', PHP_INT_MAX);
echo 'Flags von strlen: ' . $flags . PHP_EOL;
Flags von strlen: (Integer-Wert der Zend-internen Flags)

Final-Markierung einer Klasse entfernen (für Mocking im Test)

<?php
// Beispiel: Eine als final deklarierte Klasse soll im Test gemockt werden
final class PaymentService {
    public function charge(float $amount): string {
        return 'charged:' . $amount;
    }
}

// Aktuelle Klassen-Flags lesen
$currentFlags = uopz_flags('PaymentService', '', PHP_INT_MAX);
echo 'Flags vorher: ' . $currentFlags . PHP_EOL;

// ZEND_ACC_FINAL (0x00000040) entfernen, um Vererbung zu ermöglichen
uopz_flags('PaymentService', '', $currentFlags & ~ZEND_ACC_FINAL);

// Jetzt kann die Klasse extended werden (z. B. durch ein Mock-Framework)
class MockPaymentService extends PaymentService {
    public function charge(float $amount): string {
        return 'mocked';
    }
}

$mock = new MockPaymentService();
echo $mock->charge(99.99) . PHP_EOL;
Flags vorher: (Integer-Wert) mocked

Methode als abstract markieren

<?php
class BaseHandler {
    public function handle(): void {
        echo 'Basisimplementierung' . PHP_EOL;
    }
}

// Flags der Methode 'handle' lesen
$flags = uopz_flags('BaseHandler', 'handle', PHP_INT_MAX);
echo 'Aktuelle Methoden-Flags: ' . $flags . PHP_EOL;

// Methode als abstract markieren
uopz_flags('BaseHandler', 'handle', $flags | ZEND_ACC_ABSTRACT);

echo 'Methode ist nun abstract markiert.' . PHP_EOL;
Aktuelle Methoden-Flags: (Integer-Wert) Methode ist nun abstract markiert.

// Wichtig · Fallstricke

Nur für Tests und Debugging: uopz_flags manipuliert interne Zend-Engine-Strukturen direkt. Ein falsches Setzen von Flags kann zu unvorhersehbarem Verhalten, Segmentation Faults oder Interpreter-Absturz führen. Niemals in Produktionsumgebungen einsetzen.

Die UOPZ-Extension muss explizit installiert und aktiviert sein (extension=uopz in der php.ini). Ab UOPZ 5.x und PHP 7 hat sich die API leicht verändert; die Signatur für Klassen-Flags lautet uopz_flags(string $class, string $function, int $flags), wobei für Klassen-Flags (nicht Methoden) als $function ein leerer String übergeben wird.

Die Flags-Konstanten wie ZEND_ACC_FINAL oder ZEND_ACC_ABSTRACT sind durch die UOPZ-Extension definiert und stehen nur zur Verfügung, wenn die Extension geladen ist.