Ich bin mir nicht sicher, ob Bitmaske der richtige Begriff ist. Lassen Sie mich erklären:
In PHP kann die error_reporting
Funktion auf mehrere Arten aufgerufen werden:
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);
Ich habe den Begriff Bitmaske von der php.net Seite hier bekommen
Auf jeden Fall habe ich eine SIMPLE-Methode implementiert, ls
die den Inhalt eines Verzeichnisses zurückgibt.
Diese Funktion benötigt 3 Argumente ... ($ include_hidden = false, $ return_absolute = false, $ ext = false)
Wenn ich die Funktion aufrufe, lege ich fest, wie ich die Ergebnisse erzielen möchte. Ob ich möchte, dass die Ergebnisse versteckte Verzeichnisse zurückgeben, ob ich nur Basisnamen möchte usw.
Wenn ich also die Funktion aufrufe, schreibe ich
ls(true, false, true)
ls(false, false, true)
ls(true, true, true)
etc...
Ich dachte, es wäre viel besser lesbar, wenn ich nur markieren könnte, wie ich die Daten zurückgeben möchte?
so etwas wie:
ls( INCLUDE_HIDDEN | HIDE_EXTS );
ls( SHOW_ABSOLUTE_PATHS | HIDE_EXTS );
etc...
Wie würde ich dies implementieren, um zu testen, welche Flags aufgerufen wurden?
$flags & FLAG_1
- Überprüfen Sie, ob FLAG_1 gesetzt ist,$flags | FLAG_1
- Setzen Sie FLAG_1,$flags & ~FLAG_1
- Deaktivieren von FLAG_1,~$flags
- Invertieren von Flagsdefine('FLAG_1', 1<<0); define('FLAG_2', 1<<2); define('FLAG_3', 1<<3); define('FLAG_4', 1<<4);
Dies geschieht normalerweise in Cconst
Schlüsselwort keine Ausdrücke, selbst wenn das Ergebnis konstant ist (dhconst FLAG_1 = 1 << 0;
ein Analysefehler ist) - offensichtlich ist dies kein Problem mitdefine()
2). In C wird ein konstanter Ausdruck wieconst int FLAG_1 = 1 << 0;
beim Kompilieren aufgelöst und der tatsächliche kompiliert Der Wert ist das Ergebnis des Ausdrucks, während dies in PHP jedes Mal ausgewertet wird, wenn die mikroskopische Leistung beeinträchtigt wird. Keines dieser Probleme ist ein guter Grund, die von Ihnen vorgeschlagene besser lesbare Version zu vermeiden.const IS_WINDOWS = \PHP_OS & "\xDF\xDF\xDF" === 'WIN';
ist ein Äquivalent zur Kompilierungszeit der sehr verbreitetenstripos(\PHP_OS, 'WIN') === 0
Redewendung. Wie es passiert, ist dies derzeit sinnlos (PHP_OS
ist derzeit immer'WINNT'
auf allen Windows-Versionendefine( "INCLUDE_HIDDEN", 0x1 ); define( "HIDE_EXTS", 0x2 ); define( "SHOW_ABSOLUTE_PATHS", 0x4 ); //And so on, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 etc..
Sie können dann in Ihrer
ls
Funktion nach einzelnen Flags suchen :if( $flags & INCLUDE_HIDDEN ) { //<-- note just a single &, bitwise and //$flags have INCLUDE_HIDDEN }
quelle
Die anderen haben gute Vorschläge gemacht, aber heutzutage ist es viel üblicher, assoziative Arrays anstelle von Bitmasken zu übergeben. Es ist viel besser lesbar und ermöglicht es Ihnen, andere Variablen als nur wahre / falsche Werte zu übergeben. Etwas wie das:
myFunction(['includeHidden' => true, 'fileExts' => false, 'string' => 'Xyz']); function myFunction($options) { // Set the default options $options += [ 'includeHidden' => false, 'fileExts' => true, 'string' => 'Abc', ]; if ($options['includeHidden']) { ... } ... }
quelle