CakeFest 2024: The Official CakePHP Conference

uopz_flags

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

uopz_flagsRécupère ou défini les drapeaux d'une fonction ou d'une classe

Description

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

Récupère ou défini les drapeaux d'une classe ou de l'entrée d'une fonction à l'exécution.

Liste de paramètres

class

Le nom de la classe

function

Le nom de la fonction. Si class est fournie et que une chaîne de caractères vide est passé comme function, uopz_flags() récupère ou définie les drapeaux de l'entrée de classe.

flags

Un jeu valide de drapeaux ZEND_ACC_ flags. Si omit, uopz_flags() agit commt un récupérateur.

Valeurs de retour

Si des drapeaux ont été définis, retourne les anciens drapeaux, sinon, retourne les drapeaux courants

Erreurs / Exceptions

À partir de PHP 7.4.0, si le paramètre flags est fournie uopz_flags() émet une RuntimeException, si OPcache est activé, et l'entrée de classe de class ou l'entrée de fonction function est immutable.

Historique

Version Description
PECL uopz 5.0.0 Le paramètre flags est désormait optionnel. Auparavant, ZEND_ACC_FETCH devait être passé pour utiliser uopz_flags() en tant que récupérateur.

Exemples

Exemple #1 Exemple avec 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));
?>

L'exemple ci-dessus va afficher :

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

Exemple #2 Transformer une Classe finale en non-finale

<?php
final class MyClass
{
}

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

L'exemple ci-dessus va afficher :

bool(false)
add a note

User Contributed Notes 2 notes

up
1
ASchmidt at Anamera dot net
5 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
0
ASchmidt at Anamera dot net
3 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