Com esta classe, você pode adicionar sinalizadores facilmente aos seus projetos.
O número de sinalizadores que você pode usar é limitado à arquitetura do seu sistema, por exemplo: 32 sinalizadores em um sistema de 32 bits ou 64 sinalizadores no sistema de 64 bits. Para armazenar sinalizadores de 64 bits em um banco de dados, você precisará armazená-lo como bigint não assinado no MySQL ou um equivalente em seu armazenamento de dados.
Este pacote também vem com uma característica que você pode usar para implementar sinalizadores binários diretamente em sua própria classe.
Para instalar este pacote, basta executar o seguinte comando na raiz do seu projeto.
composer require reinder83/binary-flags
Os seguintes métodos podem ser usados:
Substitua a máscara atual. Isso pode ser passado como primeiro argumento no construtor.
Recupere a máscara atual.
Defina uma função de retorno de chamada que é chamada quando a máscara mudar. Isso pode ser passado como segundo argumento no construtor.
Dê o (s) nome (s) para o $mask ou a máscara atual quando omitida. Quando $asArray é true , o método retornará uma matriz com os nomes, caso contrário, uma string separada por vírgula será retornada (padrão).
Adiciona um ou vários sinalizadores à máscara atual.
Remove um ou vários sinalizadores da máscara atual.
Verifique se o sinalizador (s) fornecido (s) estiver definido na máscara atual. Por padrão, ele verificará todos os bits no sinalizador fornecido. Quando você deseja corresponder a qualquer um dos sinalizadores fornecidos, defina $checkAll como false .
Desde: v1.0.1
Para você, conveniente, adicionei um alias ao checkflag com $checkAll definido como false .
Desde: v1.2.0
Retorna o número de sinalizadores que foram definidos.
Desde: v1.2.0
Retorne um valor que pode ser codificado por JSON_ENCODE () na forma de ["mask" => 7] . Você não deve chamar esse método diretamente; em vez disso, pode passar o objeto BinaryFlags para JSON_ENCODE, que o converterá em '{"Mask": 7}'.
Os seguintes métodos estáticos podem ser usados:
Desde: v1.1.0
Retorne todas as bandeiras com seus nomes como uma matriz, usando sua máscara de bandeira como chave. Este método também pode ser sobrecarregado para retornar nomes personalizados para os sinalizadores, que serão usados pelo método getFlagNames .
Desde: v1.1.0
Retornar máscara de todas as bandeiras juntas
Desde: v1.2.0
Você pode tratar um objeto BinaryFlags como um iterável, onde cada iteração retornará o próximo valor de bits que foi definido, incluindo sua descrição (ou o nome da constante que representa o valor do bit).
Abaixo de algum exemplo de código de uso
// 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 Por padrão, os nomes dos sinalizadores são baseados nos nomes constantes
$ 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' Se você deseja nomes de sinalizadores personalizados que não são iguais aos nomes constantes, você pode substituí -los com 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 );Para insetos ou solicitações de recurso, não hesite em entrar em contato comigo ou enviar um problema ou solicitar. Ou você pode me apoiar comprando um café: