uopz_flags

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

uopz_flagsObtém ou define sinalizadores em função ou classe

Descrição

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

Obtém ou define os sinalizadores em uma entrada de classe ou função em tempo de execução.

Parâmetros

class

O nome de uma classe

function

O nome da função. Se class for fornecido e uma string vazia for passada como function, uopz_flags() obtém ou define os sinalizadores da entrada da classe.

flags

Um conjunto válido de sinalizadores ZEND_ACC_. Se omitido, uopz_flags() atua como obtentora.

Valor Retornado

Se os sinalizadores estiverem sendo definidos, retorna os anteriores, senão retorna os atuais.

Erros/Exceções

A partir do PHP 7.4.0, se o parâmetro flags for passado, uopz_flags() lança uma RuntimeException, se OPcache estiver habilitado, e a entrada de classe de class ou a entrada de função de function for imutável.

Registro de Alterações

Versão Descrição
PECL uopz 5.0.0 O parâmetro flags agora é opcional. Anteriormente, ZEND_ACC_FETCH precisava ser passado para usar uopz_flags() como obtentora.

Exemplos

Exemplo #1 Exemplo de 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));
?>

O exemplo acima produzirá:

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

Exemplo #2 "Desfinalizando" uma classe

<?php
final class MyClass
{
}

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

O exemplo acima produzirá:

bool(false)
adicione uma nota

Notas Enviadas por Usuários (em inglês) 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