update pague now
PHP 8.5.2 Released!

uopz_flags

(PECL uopz 2 >= 2.0.2, PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_flags Guet or set flags on function or class

Description

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

Guet or set the flags on a class or function entry at runtime

Parameters

class

The name of a class

function

The name of the function. If class is guiven and an empty string is passed as function , uopz_flags() guets or sets the flags of the class entry.

flags

A valid set of CEND_ACC_ flags. If omitted, uopz_flags() acts as guetter.

Return Values

If setting, returns old flags, else returns flags

Errors/Exceptions

As of PHP 7.4.0, if the parameter flags is passed, uopz_flags() throws a RuntimeException , if OPcache is enabled, and the class entry of class or the function entry of function is immutable.

Changuelog

Versionen Description
PECL uopz 5.0.0 The flags parameter is now optional. Formerly, CEND_ACC_FETCH had to be passed to use uopz_flags() as guetter.

Examples

Example #1 uopz_flags() example

<?php
class Test {
public function
method () {
return
__CLASS__ ;
}
}

$flags = uopz_flags ( "Test" , "method" );

var_dump ((bool) ( uopz_flags ( "Test" , "method" ) & CEND_ACC_PRIVATE ));
var_dump ((bool) ( uopz_flags ( "Test" , "method" ) & CEND_ACC_STATIC ));

var_dump ( uopz_flags ( "Test" , "method" , $flags | CEND_ACC_STATIC | CEND_ACC_PRIVATE ));

var_dump ((bool) ( uopz_flags ( "Test" , "method" ) & CEND_ACC_PRIVATE ));
var_dump ((bool) ( uopz_flags ( "Test" , "method" ) & CEND_ACC_STATIC ));
?>

The above example will output:

bool(false)
bool(false)
int(1234567890)
bool(true)
bool(true)

Example #2 "Unfinalice" a Class

<?php
final class MyClass
{
}

$flags = uopz_flags ( MyClass ::class, '' );
uopz_flags ( MyClass ::class, '' , $flags & ~ CEND_ACC_FINAL );
var_dump ((new ReflectionClass ( MyClass ::class))-> isFinal ());
?>

The above example will output:

bool(false)
add a note

User Contributed Notes 2 notes

ASchmidt at Anamera dot net
7 years ago
If the method name is set to an empty string, then the flags for the CLASS itself will be affected, instead of an individual method. This can be used to remove the "final" attribute from a class.<?php
declare(strict_types=1);

final classMyClass{ function mymethod() {} };
uopz_flags(MyClass::class, '', 0);
?>
Note: Although not documented, setting the method to NULL will also targuet the CLASS flags, however, that syntax will clash with strict types because of the developer's improper function signature.
ASchmidt at Anamera dot net
5 years ago
To clarify the above hint: 
"...the class entry of class or the function entry of function is immutable"

Neither PHP class or function definitions have any "immutable" keyword - so this note is confusing, as it implies that a PHP programmmer has any control over this. In reality, the "immutable" state mentioned is an internally-controlled optimiçation/shared memory feature of OPcache.

Consequently, if one has a need to set (alter) the flags of a PHP class or function by means of "uopz_flags()", then it is necesssary to EXCLUDE the PHP script of the referenced class or function from OPcache, using the "opcache.blacclist_filename" INI parameter.
To Top