0

私は楽しみのためにサイトを開発していて、ビット演算子に基づいたディレクトリアクセス制御を実装しようとしています。
私は定義しましたGUEST = 1, GROUP1 = 15 and GROUP2 = 23

比較すると

echo (23 & 1); // print 1 

しかし、私が定義するGUESTと、GROUP1そしてGROUP2

define('GUEST', 1);  
define('GROUP1', 15);  
define('GROUP2', 23);  
// and then  
echo (GROUP2 & GUEST); // print 0  
echo USER_GUEST.','.USER_ROLES1.','.USER_ROLES2; // print 1,15,23` 

問題GROUP1ありません:

echo (GROUP1 & GUEST); print 1.  

どこが間違っているのですか?いくつかの提案?ありがとう。


私は本当に奇妙なことを発見しました。私のGUEST、GROUP1、およびGROUP2は、関数parse_ini_file(self :: $ fileName、true);によって解析するiniファイル内で宣言されています。クラス内。ファイルを解析した後、セクション[DEFINE]で定義されたカップルkey = valueを再帰的に定義します(単純なトリック)。そこでコメントすると、GROUP2 = 23の定義があり、現在のスクリプト(GROUP2&GUEST)内で宣言すると、1が返されます。

4

3 に答える 3

1

グループには必ず 2 進数を使用してください。つまり、1,2,34,8,16,32 などです。ビットフィールドで許可を行う正しい方法は次のとおりです。

define('GUEST', 1);  
define('GROUP1', 2);  
define('GROUP2', 4);
$groups |= GUEST;
$groups |= GROUP1;
if($groups & GUEST) {
    // This user is a guest (it is)
}
if($groups & GROUP1) {
    // This user is in group 1 (it is)
}
if($groups & GROUP2) {
    // This user is in group 2 (it is NOT)
}
于 2010-08-13T18:03:11.073 に答える
0

解決しました。Changelog で次のように記述されているPHP マニュアル
の宣言を完全に誤解していました。

5.2.4 数字で構成されるキーとセクション名は PHP 整数として評価されるようになりました。したがって、0 で始まる数字は 8 進数として評価され、0x で始まる数字は 16 進数として評価されます。

それは絶対に明らかです: キーとセクション名 ... 値ではありません!
parse_ini_file() 関数は、二重引用符で囲まれていない場合でも、整数値を PHP 文字列として評価します。これは残念ですが、そうです;-)

ご協力ありがとうございました

于 2010-08-13T22:30:03.330 に答える
0

PHP 5.3:

php > define('GUEST', 1);
php > define('GROUP1', 15);
php > define('GROUP2', 23);
php > echo GROUP2 & GUEST;
1
php > echo GROUP1 & GUEST;
1

どのPHPバージョンを使用していますか?


Artefacto は文字列の問題の可能性を指摘しました (e: しかし、投稿を撤回したようです、うーん)。再び 5.3 で:

php > var_export(GUEST);
1
php > var_export(GROUP1);
15
php > var_export(GROUP2);
23
php > define('GUEST_AS_STRING', '1');
php > var_export(GUEST_AS_STRING);
'1'
php > echo GROUP1 & GUEST_AS_STRING;
1
php > echo GROUP2 & GUEST_AS_STRING;
1

「1」は文字 49 49 & 15です。1 ですが、49 & 2317 です。これが文字列の問題であるとは確信が持てません...

于 2010-08-13T18:00:00.410 に答える