このクラスを使用すると、プロジェクトにフラグを簡単に追加できます。
使用できるフラグの数は、システムのアーキテクチャに限定されています。たとえば、32ビットシステムの32フラグまたは64ビットシステムの64フラグです。 64ビットのフラグをデータベースに保存するには、MySQLに署名されていないBigintまたはDataStoreに相当するものとして保存する必要があります。
このパッケージには、自分のクラスでバイナリフラグを直接実装するために使用できる特性も付属しています。
このパッケージをインストールするには、プロジェクトのルートで次のコマンドを実行するだけです。
composer require reinder83/binary-flags
次の方法を使用できます。
現在のマスクを上書きします。これは、コンストラクターの最初の引数として渡すことができます。
現在のマスクを取得します。
マスクが変更されたときに呼び出されるコールバック関数を設定します。これは、コンストラクターの2番目の引数として渡すことができます。
省略されたら、指定された$maskまたは現在のマスクの名前を付けます。 $asArrayがtrueの場合、メソッドは名前のある配列を返します。そうしないと、コンマ分離文字列が返されます(デフォルト)。
現在のマスクに1つまたは複数のフラグを追加します。
現在のマスクから1つまたは複数のフラグを削除します。
指定されたフラグが現在のマスクに設定されているかどうかを確認してください。デフォルトでは、指定されたフラグ内のすべてのビットを確認します。指定されたフラグのいずれかを一致させたい場合は$checkAll falseに設定します。
以来:v1.0.1
便利なために、 $checkAll falseに設定してCheckFlagにエイリアスを追加しました。
以来:v1.2.0
設定されたフラグの数を返します。
以来:v1.2.0
["mask" => 7]の形でjson_encode()によってエンコードできる値を返します。このメソッドを直接呼び出す必要はないはずです。代わりに、binaryflagsオブジェクトをjson_encodeに渡すことができます。これにより、 '{"mask":7}'に変換できます。
次の静的方法を使用できます。
以来:v1.1.0
フラグマスクをキーとして使用して、名前を配列としてすべてのフラグを返します。この方法は、 getFlagNamesメソッドで使用されるフラグのカスタム名を返すために過負荷にすることもできます。
以来:v1.1.0
すべてのフラグのマスクを一緒に返します
以来:v1.2.0
BinaryFlagsオブジェクトを反復可能なものとして扱うことができます。各反復は、その説明(またはビット値を表す定数の名前)を含む設定された次のビット値を返します。
いくつかの例以下の使用コード
// example classes which the following examples will refer to
use Reinder83 BinaryFlags BinaryFlags ;
use Reinder83 BinaryFlags Bits ;
class ExampleFlags extends BinaryFlags
{
const FOO = Bits:: BIT_1 ;
const BAR = Bits:: BIT_2 ;
const BAZ = Bits:: BIT_3 ;
} $ exampleFlags = new ExampleFlags ();
// add BAR flag
$ exampleFlags -> addFlag (ExampleFlags:: BAR );
var_export ( $ exampleFlags -> checkFlag (ExampleFlags:: FOO ));
// false
var_export ( $ exampleFlags -> checkFlag (ExampleFlags:: BAR ));
// true
// remove BAR flag
$ exampleFlags -> removeFlag (ExampleFlags:: BAR );
var_export ( $ exampleFlags -> checkFlag (ExampleFlags:: BAR ));
// false $ exampleFlags = new ExampleFlags ();
// add FOO and BAR
$ exampleFlags -> addFlag (ExampleFlags:: FOO | ExampleFlags:: BAR );
var_export ( $ exampleFlags -> checkFlag (ExampleFlags:: FOO ));
// true
var_export ( $ exampleFlags -> checkFlag (ExampleFlags:: FOO | ExampleFlags:: BAZ ));
// false because BAZ is not set
var_export ( $ exampleFlags -> checkFlag (ExampleFlags:: FOO | ExampleFlags:: BAR ));
// true because both flags are set
var_export ( $ exampleFlags -> checkFlag (ExampleFlags:: FOO | ExampleFlags:: BAZ , false ));
// true because one of the flags is set (FOO)
// alias of the above method
var_export ( $ exampleFlags -> checkAnyFlag (ExampleFlags:: FOO | ExampleFlags:: BAZ ));
// true デフォルトでは、フラグ名は定数名に基づいています
$ exampleFlags = new ExampleFlags ();
$ exampleFlags -> addFlag (ExampleFlags:: FOO | ExampleFlags:: BAR | ExampleFlags:: BAZ );
var_export ( $ exampleFlags -> getFlagNames ());
// 'Foo, Bar, Baz'
// null will force current mask
var_export ( $ exampleFlags -> getFlagNames ( null , true ));
/*
array (
0 => 'Foo',
1 => 'Bar',
2 => 'Baz',
)
*/
// get flag names of given mask
var_export ( $ exampleFlags -> getFlagNames (ExampleFlags:: FOO | ExampleFlags:: BAR ));
// 'Foo, Bar' 定数名と等しくないカスタムフラグ名が必要な場合は、 getAllFlags()でこれらをオーバーライドできます
class ExampleFlagsWithNames extends BinaryFlags
{
const FOO = Bits:: BIT_1 ;
const BAR = Bits:: BIT_2 ;
const BAZ = Bits:: BIT_3 ;
public static function getAllFlags ()
{
return [
static :: FOO => ' My foo description ' ,
static :: BAR => ' My bar description ' ,
static :: BAZ => ' My baz description ' ,
];
}
}
$ exampleFlags = new ExampleFlagsWithNames ();
$ exampleFlags -> addFlag (ExampleFlags:: FOO | ExampleFlags:: BAR | ExampleFlags:: BAZ );
// null will force current mask
var_export ( $ exampleFlags -> getFlagNames ( null , true ));
/*
array (
0 => 'My foo description',
1 => 'My bar description',
2 => 'My baz description',
)
*/ use Illuminate Database Eloquent Model ;
class Test extends Model
{
private $ flagsObject ;
/**
* Retrieve flags
* @return ExampleFlags
*/
public function getFlagsAttribute ()
{
if ( $ this -> flagsObject === null ) {
$ this -> flagsObject = new ExampleFlags (
$ this -> attributes [ ' flags ' ], // set current flags mask
function ( ExampleFlags $ flags ) { // set callback function
// update the flags in this model
$ this -> setAttribute ( ' flags ' , $ flags -> getMask ());
}
);
}
return $ this -> flagsObject ;
}
}
// retrieve object from DB
$ test = Test:: find ( 1 );
// do binary operations on the flags class as described earlier
$ test -> flags -> checkFlag (ExampleFlag:: FOO );バグまたは機能リクエストについては、お気軽に連絡するか、問題を提出するか、リクエストをプルしてください。または、あなたは私にコーヒーを買うことで私をサポートすることができます: