私は、アプリケーションのさまざまな領域でさまざまなユーザー設定とアクセス許可に対して、PHP でビットマスクまたはビットフィールドを使用する最良の方法を長い間見つけようとしてきました。私がこれまでに行った中で最も遠いのは、Stack Overflow の投稿Bitmask in PHP for settings? で svensによって提供されたクラスからのものです。. DEFINE の代わりにクラス定数を使用するように変更し、get メソッドに int のみが渡されるようにしました。以下に、クラスの機能をテストするためのサンプル コードをいくつか示します。
このクラスをさらに改善するための提案/コードを探しているので、アプリケーションで設定や場合によってはユーザー権限に使用できます。
以下のコメントで mcrumley が回答
さらに、定数の番号付けについて質問があります。このタイプの他のクラスとコード サンプルでは、2 の累乗でリストされているものがあります。ただし、定数に 1、2、3、4、5、6 の番号を付けても、私が知る限り、同じように機能するようです。 1、2、4、8、16などの代わりに。定数を変更する必要があるかどうかを誰かが明確にすることもできますか?
いくつかのアイデア...このクラスを拡張して、他のクラスで簡単に使用できるようにする方法を本当に考えたいと思います。User
クラスとクラスがあるとしましょうMessages
。User
との両方Messages
クラスはこのクラスを拡張し、設定/権限にビットマスクを使用できるようになります (後で他のクラスと共に)。それで、現在のクラス定数を変更して、それらを渡すことができるようにするか、他のオプションを指定する必要がありますか? サイト/スクリプトの他の部分で (define('PERM_READ', 1);) を定義する必要はなく、ある程度カプセル化したままにしておく必要がありますが、柔軟性もあります。私はアイデアを受け入れます。設定や権限のために他の複数のクラスで使用すると言ったように、これを堅固で柔軟にしたいと考えています。おそらく、ある種の配列を使用する必要がありますか? 上記にリンクされた私の以前の質問の@Svensは、「いくつかの自動魔法のゲッター/セッターまたはArrayAccessを実装して、さらに素晴らしいものにします。 – svens」というコメントを投稿しました。
可能であれば、サンプル ソース コードを含めてください。
<?php
class BitField {
const PERM_READ = 0;
const PERM_WRITE = 1;
const PERM_ADMIN = 2;
const PERM_ADMIN2 = 3;
const PERM_ADMIN3 = 4;
private $value;
public function __construct($value=0) {
$this->value = $value;
}
public function getValue() {
return $this->value;
}
public function get($n) {
if (is_int($n)) {
return ($this->value & (1 << $n)) != 0;
}else{
return 0;
}
}
public function set($n, $new=true) {
$this->value = ($this->value & ~(1 << $n)) | ($new << $n);
}
public function clear($n) {
$this->set($n, false);
}
}
?>
使用例...
<?php
$user_permissions = 0; //This value will come from MySQL or Sessions
$bf = new BitField($user_permissions);
// Turn these permission to on/true
$bf->set($bf::PERM_READ);
$bf->set($bf::PERM_WRITE);
$bf->set($bf::PERM_ADMIN);
$bf->set($bf::PERM_ADMIN2);
$bf->set($bf::PERM_ADMIN3);
// Turn permission PERM_ADMIN2 to off/false
$bf->clear($bf::PERM_ADMIN2); // sets $bf::PERM_ADMIN2 bit to false
// Get the total bit value
$user_permissions = $bf->getValue();
echo '<br> Bitmask value = ' .$user_permissions. '<br>Test values on/off based off the bitmask value<br>' ;
// Check if permission PERM_READ is on/true
if ($bf->get($bf::PERM_READ)) {
// can read
echo 'can read is ON<br>';
}
if ($bf->get($bf::PERM_WRITE)) {
// can write
echo 'can write is ON<br>';
}
if ($bf->get($bf::PERM_ADMIN)) {
// is admin
echo 'admin is ON<br>';
}
if ($bf->get($bf::PERM_ADMIN2)) {
// is admin 2
echo 'admin 2 is ON<br>';
}
if ($bf->get($bf::PERM_ADMIN3)) {
// is admin 3
echo 'admin 3 is ON<br>';
}
?>