CakeFest 2024: The Official CakePHP Conference

uopz_flags

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

uopz_flagsПолучить или установить флаги для функции или класса

Описание

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

Получить или установить флаги для записи функции или класса во время выполнения

Список параметров

class

Имя класса

function

Имя функции. Если задан class и пустая строка передана как function, uopz_flags() получает или устанавливает флаги записи класса.

flags

Корректный набор флагов ZEND_ACC_. Если не заданы, uopz_flags() используется как геттер.

Возвращаемые значения

При установке новых флагов, возвращает старые флаги, иначе возвращает текущие флаги

Ошибки

Начиная с PHP 7.4.0, если передан параметр flags, uopz_extends() выбрасывает RuntimeException, если OPcache включён и запись класса либо class, либо parent (если это признак) неизменны.

Список изменений

Версия Описание
PECL uopz 5.0.0 Параметр flags теперь необязательный. Ранее ZEND_ACC_FETCH должен был передаваться, чтобы uopz_flags() использовался как геттер.

Примеры

Пример #1 Пример использования 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));
?>

Результат выполнения приведённого примера:

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

Пример #2 "Отменить 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());
?>

Результат выполнения приведённого примера:

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