PHP Velho Oeste 2024

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() 関数が getter として振る舞います。

戻り値

フラグを設定する場合、古いフラグを返します。それ以外の場合、現在のフラグを返します。

エラー / 例外

PHP 7.4.0 以降で flags が渡された場合は、 OPcache が有効になっており、 かつ classfunction のエントリが変更不能な場合、 RuntimeException をスローするようになりました。

変更履歴

バージョン 説明
PECL uopz 5.0.0 flags はオプションになりました。 このバージョンより前は、 uopz_flags() を getter として使うために ZEND_ACC_FETCH を渡さなければなりませんでした。

例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 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