PHP:如何从ini_get_all函数中理解访问的位掩码值

j2qf4p5b  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(97)

此问题已在此处有答案

Bitmask in PHP for settings?(2个答案)
3天前关闭。
我将开始使用ini_get_all函数检索共享主机服务器上所有配置选项。最后我得到了这个数组块:

[allow_call_time_pass_reference] => Array
    (
        [global_value] => 1
        [local_value] => 1
        [access] => 6
    )

[allow_url_fopen] => Array
    (
        [global_value] => 1
        [local_value] => 1
        [access] => 4
    )

PHP手册只是给予了描述:
一个指令可以有多个访问级别,这就是为什么access会显示相应的位掩码值。
那么,谁能解释一下“访问”?如何理解它的bitmask值?

xdyibdwo

xdyibdwo1#

如果你在“返回值”一节中阅读了a little further,你会发现link to the change modes及其含义:

  • 1PHP_INI_USER:条目可以在用户脚本中设置(如使用ini_set())或在Windows注册表中设置
  • 2PHP_INI_PERDIR:可以在php.ini、.htaccess或httpd.conf中设置条目
  • 4PHP_INI_SYSTEM:可以在php.ini或httpd.conf中设置条目
  • 7PHP_INI_ALL:可以在任何地方设置条目
z3yyvxxp

z3yyvxxp2#

正确值

我在PHP源代码中查找了它,找到了可以定义为常量的内容:

define('PHP_INI_USER', 1)
define('PHP_INI_PERDIR', 2)
define('PHP_INI_SYSTEM', 4)
define('PHP_INI_ALL', PHP_INI_USER | PHP_INI_PERDIR | PHP_INI_SYSTEM); // = 7

要从ini_get_all()检查访问级别,您可以执行以下操作(以allow_url_fopen为例):

$all = ini_get_all();
$config = $all['allow_url_fopen'];
$isUserLevel = $config['access'] & PHP_INI_USER; // PHP_INI_USER = 1

仅供参考

在main/php_ini. h中的PHP源代码中,这些常量被定义为Zend等价物的别名:

#define PHP_INI_USER    ZEND_INI_USER
#define PHP_INI_PERDIR  ZEND_INI_PERDIR
#define PHP_INI_SYSTEM  ZEND_INI_SYSTEM

#define PHP_INI_ALL ZEND_INI_ALL

https://github.com/php/php-src/blob/c8aa6f3a9a3d2c114d0c5e0c9fdd0a465dbb54a5/main/php_ini.h#L45(第45至49行)
Zend等价物在Zend/zend_ini. h中定义如下:

#define ZEND_INI_USER   (1<<0)
#define ZEND_INI_PERDIR (1<<1)
#define ZEND_INI_SYSTEM (1<<2)

#define ZEND_INI_ALL (ZEND_INI_USER|ZEND_INI_PERDIR|ZEND_INI_SYSTEM)

https://github.com/php/php-src/blob/c8aa6f3a9a3d2c114d0c5e0c9fdd0a465dbb54a5/Zend/zend_ini.h#L24(第24至28行)
<<是C++中的按位移位运算符,因此1<<0 = 1,1<<1 = 2,1<<2 = 4。ZEND_INI_ALL是1+2+4 = 7的加法。

相关问题