いている方もいるかもしれませんの使用ビット単位/ビットマスクにPHP?

StackOverflow https://stackoverflow.com/questions/1380045

  •  21-09-2019
  •  | 
  •  

質問

また、ユーザーの役割/許可制度PHPのためのスクリプト

以下のコードをビットマスクの方法のためのアクセス権を見てphpbuilder.com.

以下にその部分が簡単になり版w3hichがbasicly同じことなのです。

多くの人におすすめビット事業者等の設定やその他のものPHPのことがありませんわかものです。に以下のコードはありま の他利益 からの最初のコードの代わりに。

<?php
/**
 * Correct the variables stored in array.
 * @param    integer    $mask Integer of the bit
 * @return    array
 */
function bitMask($mask = 0) {
    $return = array();
    while ($mask > 0) {
        for($i = 0, $n = 0; $i <= $mask; $i = 1 * pow(2, $n), $n++) {
            $end = $i;
        }
        $return[] = $end;
        $mask = $mask - $end;
    }
    sort($return);
    return $return;
}


define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD',  2);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 8);

//run function
// this value would be pulled from a user's setting mysql table
$_ARR_permission = bitMask('5');

if(in_array(PERMISSION_READ, $_ARR_permission)) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}
?>

非ビット版

<?PHP
/*
   NON bitwise method
*/

// this value would be pulled from a user's setting mysql table
$user_permission_level = 4;

if($user_permission_level === 4) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}

?>
役に立ちましたか?

解決

なぜ、ちょうどこれをしない...

define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD',  2);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 8);

//run function
// this value would be pulled from a user's setting mysql table
$_ARR_permission = 5;

if($_ARR_permission & PERMISSION_READ) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}
あなたはビットを使用する場合は、あなたはまた、権限の任意の組み合わせの多くを作成することができます...

$read_only = PERMISSION_READ;
$read_delete = PERMISSION_READ | PERMISSION_DELETE;
$full_rights = PERMISSION_DENIED | PERMISSION_READ | PERMISSION_ADD | PERMISSION_UPDATE | PERMISSION_DELETE;

//manipulating permissions is easy...
$myrights = PERMISSION_READ;
$myrights |= PERMISSION_UPDATE;    // add Update permission to my rights

他のヒント

最初に利用することができますしてくパーミッションのコンフリクトの読み込み/追加/更新のための例です。次の例では、ユーザーが PERMISSION_UPDATE.

ビット単位の試作品の試験ビット実数値です。

例えば、バイナリの配列 10010 を識別できるユーザー PERMISSION_DELETEPERMISSION_READ (このビットの識別 PERMISSION_READ の列は2、ビットの識別 PERMISSION_DELETE のカラムのための16), 10010 バイナリは18小数点(16+2=18).第二サンプルコードすることを認めていませんおいえます。なにができる以上スタイルチェックが想定した皆様 PERMISSION_DELETE また、 PERMISSION_UPDATE, を与える恐れがあるため、有効なすることが推定される。

私は非常に頻繁にビットマスクを使用していないという理由だけで、多分それはだが、私は、開発者の生産性とコードの可読性が(明らかに限度内で)速度やメモリ使用量よりも重要であるPHPのような言語では、本当の理由はありませんことを見つけます使用bitmaskingへ。

なぜ代わりに権限のようなトラックの物事は、ユーザーログイン、などというクラスを作成しますか?のは、認証を呼び出してみましょう。あなたは、ユーザーが権限を持っていることを確認したい場合はその後、あなたは、メソッドのHasPermissionを作成することができます。 例えば。、

if(Auth::logged_in() && Auth::currentUser()->hasPermission('read'))
    //user can read

あなたは、彼らが権限のいくつかの組み合わせを持っているかどうかを確認する場合:

if(Auth::logged_in() && Auth::currentUser()->hasAllPermissions('read', 'write'))
    //user can read, and write

またはあなたは、彼らが権限のある特定のグループのいずれかを持っているかどうかを確認する場合:

if(Auth::logged_in() && Auth::currentUser()->hasAnyPermissions('read', 'write'))
    //user can read, or write

もちろん、それはあなただけの文字列「読み取り」であると定義し、その上で可能なPERMISSION_READなどの定数を、定義することは悪い考えではないかもしれない。

メソッド名は、それはあなたが探しているされて正確に何を教えているためです。

私は読みやすいビットマスクよりも、このアプローチを見つけます

編集:rereadingの問題なんだかとってもおいしそうに、ユーザーのアクセス権を編成において、さまざまなデータベースにbitfield.この場合におけるビット単位です。一般ユーザーの許可のデータベース 5PERMISSION_READPERMISSION_DENIED ので (PERMISSION_READ & 5) != 0, は、 (PERMISSION_DENIED & 5) != 0.なんて PERMISSION_ADD, ので、 (PERMISSION_ADD & 5) == 0

ます。すべての複雑なものにビット単位の例に見えます。


だかビット単位で運営している方、いつか使用します。 すでに多くのります。場合に快適な、そして使用していると感じます。また誰が書いたんですビット単位のコード)な実態を把握するビット単位です。が問題のように、この pow() 機能を使用することを否定どのような性能です。の代わりに、 pow(2, $n), を利用して発見されたビット単位の 1 << $n, ります)

とし、二つのコードはいないような同じです。

<のhref = "http://code.google.com/p/samstyle-php-framework/source/browse/trunk/class/bit.classでbit.class.phpにあるものを使用してみてください。 PHP」のrel = "nofollowをnoreferrer"> http://code.google.com/p/samstyle-php-framework/source/browse/trunk/class/bit.class.php の

特定のビットに対するチェック:

<?php

define('PERMISSION_DENIED', 1);
define('PERMISSION_READ', 2);
define('PERMISSION_ADD',  3);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 5);


if(bit::query($permission,PERMISSION_DENIED)){
echo 'Your permission is denied';
exit();
}else{
// so on
}

?>

とオンとオフにするには:

<?php

$permissions = 8;
bit::toggle(&$permissions,PERMISSION_DENIED);

var_dump($permissions); // outputs int(9)

?>
PERMISSION_READが

自体をマスクである場合、このの

問題があります

if($ARR_permission & PERMISSION_READ) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';

、その後について 0101 - $ rightWeHave 0011 - $ rightWeRequire

それがあるべきように、我々は、おそらくしたくないアクセス許可され、

このです

if (($rightWeHave & $rightWeRequire) == $rightWeRequire) {
echo 'access granted';
}

今のための

0101 0011

結果が

それは0011に等しくされていないため、アクセスが許可されていないので、

0001

が、

のために

1101 0101

結果は0101であるように、それは大丈夫です。

小数で設定されているマスク

スクリプトをチェックします。たぶん、誰かがそれを必要とします。

<?php

$max = 1073741824;
$series = array(0);
$x = 1;
$input = $argv[1]; # from command line eg.'12345': php script.php 12345
$sum = 0;

# generates all bitmasks (with $max)
while ($x <= $max) {
    $series[] = $x;
    $x = $x * 2;
}

# show what bitmask has been set in '$argv[1]'
foreach ($series as $value) {
    if ($value & $input) {
        $sum += $value;
        echo "$value - SET,\n";
    } else {
        echo "$value\n";
    }
}

# sum of set masks
echo "\nSum of set masks: $sum\n\n";

出力(PHP maskChecker.php 123):

0
1 - SET,
2 - SET,
4
8 - SET,
16 - SET,
32 - SET,
64 - SET,
128
256
512
1024
2048
4096
8192
(...)

Sum of set mask: 123

私は、最初の例はあなたに正確に何の権限ユーザーが持っているより多くの制御を与えると思います。第二に、あなただけのユーザーレベル」を持っています。あなたはこのような微細なコントロールを持っていないので、おそらくより高いレベルは、下の「レベル」ユーザに付与されたすべての権限を継承します。

また、私が正しく理解している場合は、行

if($user_permission_level === 4)

を持つユーザーのみが正確にの許可レベル4は、アクションへのアクセス権を持っていることを意味します - 確かにあなたは、ユーザーがの少なくとものそのレベルを持っていることを確認したいでしょうか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top