С помощью этого класса вы можете легко добавить флаги в свои проекты.
Количество флагов, которые вы можете использовать, ограничено архитектурой вашей системы, например: 32 флаги на 32-битной системе или 64 флагах в 64-битной системе. Чтобы сохранить 64-битные флаги в базе данных, вам нужно будет хранить его в виде Unsigned Bigint в MySQL или эквивалент в вашем хранилище данных.
Этот пакет также поставляется с чертой, которую вы можете использовать для реализации бинарных флагов непосредственно в собственном классе.
Чтобы установить этот пакет, просто запустите следующую команду в корне вашего проекта.
composer require reinder83/binary-flags
Можно использовать следующие методы:
Перезаписать текущую маску. Это может быть принято как первый аргумент в конструкторе.
Получить текущую маску.
Установите функцию обратного вызова, которая вызывается при изменении маски. Это может быть принято как второй аргумент в конструкторе.
Дайте имя (ы) для данной $mask или текущей маски при опущенной. Когда $asArray true метод вернет массив с именами, в противном случае будет возвращена строка запятой (по умолчанию).
Добавляет один или несколько флагов в текущую маску.
Удаляет один или несколько флагов из текущей маски.
Проверьте, указаны ли флаги (ы) в текущей маске. По умолчанию он проверит все биты в данном флаге. Если вы хотите соответствовать любому из данных флагов, установите $checkAll с false .
С тех пор: v1.0.1
Для вас удобно я добавил псевдоним для Checkflag с $checkAll установленным в false .
С тех пор: v1.2.0
Возвращает количество флагов, которые были установлены.
С тех пор: v1.2.0
Верните значение, которое может быть кодировано JSON_ENCODE () в форме ["mask" => 7] . Вам не нужно напрямую вызывать этот метод, вместо этого вы можете передать объект 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 );Для ошибок или запросов функций не стесняйтесь обращаться ко мне или отправить проблему или запрос на вытягивание. Или вы можете поддержать меня, купив мне кофе: