uopz_flags
(PECL uopz 2 >= 2.0.2, PECL uopz 5, PECL uopz 6, PECL uopz 7)
uopz_flags — 関数またはクラスのフラグを 取得/設定 する
説明
実行時にクラスまたは関数エントリのフラグを 取得/設定 します。
パラメータ
class
-
クラス名を指定します。
function
-
関数名を指定します。
class
が指定され、 かつfunction
の値にから文字列が指定されると、 uopz_flags() はクラスエントリのフラグを取得または設定します。 flags
-
ZEND_ACC_ フラグの有効なセット。 省略された場合、uopz_flags() 関数が getter として振る舞います。
戻り値
フラグを設定する場合、古いフラグを返します。それ以外の場合、現在のフラグを返します。
エラー / 例外
PHP 7.4.0 以降で flags
が渡された場合は、
OPcache が有効になっており、
かつ class
や function
のエントリが変更不能な場合、
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
User Contributed Notes 2 notes
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.
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.
↑ and ↓ to navigate •
Enter to select •
Esc to close
Press Enter without
selection to search using Google