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