uopz_flags

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

uopz_flagsRecupera o define los flags de una función o clase

Descripción

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

Recupera o define los flags de una clase o entrada de función en tiempo de ejecución.

Parámetros

class

El nombre de la clase

function

El nombre de la función. Si class es proporcionado y una string vacía es pasada como function, uopz_flags() recupera o define los flags de la propia clase.

flags

Un conjunto válido de flags ZEND_ACC_. Si se omite, uopz_flags() actúa como recuperador.

Valores devueltos

Si se definen flags, devuelve los flags antiguos, de lo contrario, devuelve los flags actuales

Errores/Excepciones

A partir de PHP 7.4.0, si el parámetro flags es proporcionado uopz_flags() emite una RuntimeException, si OPcache está activado, y la entrada de clase de class o la entrada de función function es inmutable.

Historial de cambios

Versión Descripción
PECL uopz 5.0.0 El parámetro flags es ahora opcional. Anteriormente, ZEND_ACC_FETCH debía ser pasado para usar uopz_flags() como recuperador.

Ejemplos

Ejemplo #1 Ejemplo con uopz_flags()

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

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

var_dump((bool) (uopz_flags("Test", "method") & ZEND_ACC_PRIVATE));
var_dump((bool) (uopz_flags("Test", "method") & ZEND_ACC_STATIC));

var_dump(uopz_flags("Test", "method", $flags|ZEND_ACC_STATIC|ZEND_ACC_PRIVATE));

var_dump((bool) (uopz_flags("Test", "method") & ZEND_ACC_PRIVATE));
var_dump((bool) (uopz_flags("Test", "method") & ZEND_ACC_STATIC));
?>

El resultado del ejemplo sería:

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

Ejemplo #2 Transformar una clase final en no final

<?php
final class MyClass
{
}

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

El resultado del ejemplo sería:

bool(false)
add a note

User Contributed Notes 2 notes

up
0
ASchmidt at Anamera dot net
6 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 class
MyClass { function mymethod() {} };
uopz_flags(MyClass::class, '', 0);
?>

Note: Although not documented, setting the method to NULL will also target the CLASS flags, however, that syntax will clash with strict types because of the developer's improper function signature.
up
-1
ASchmidt at Anamera dot net
4 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 programmer has any control over this. In reality, the "immutable" state mentioned is an internally-controlled optimization/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 necessary to EXCLUDE the PHP script of the referenced class or function from OPcache, using the "opcache.blacklist_filename" INI parameter.
To Top