86

たとえば、次のコードを見てください。

phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);

単一の引数が使用されていますが、単一のパイプ記号で区切られたオプションのリストを提供しています。

  • 関数の引数値で正確に何が起こっているのでしょうか?
  • 自分の関数で同じものを使用できますか?
  • 代わりに配列を渡すと言うよりも、これには利点がありますか?
4

2 に答える 2

151

ビット演算子

ビット演算子は、関連する値のビットを変更します。ビットごとのOR基本的には、左と右の両方の引数の各ビットを一緒に論理和します。例えば:

5 | 2

次のようにビット/バイナリに変換されます。

101 | 10

その結果、次のようになります。

111

なぜなら:

1 || 0 = 1
0 || 1 = 1
1 || 0 = 1

そして、次の場合に正確に得られる 7 の表現である整数として:

echo 5 | 2;

エディ・イザードの言葉を借りれば... フラグだ!

Ignacio が述べているように、これは PHP (および他の言語) で複数のフラグを組み合わせる方法として最もよく使用されます。通常、各フラグは定数として定義され、その値は通常、異なるオフセットで 1 ビットだけを表す整数に設定されます。

define('FLAG_A', 1); /// 0001
define('FLAG_B', 2); /// 0010
define('FLAG_C', 4); /// 0100
define('FLAG_D', 8); /// 1000

次に、ORこれらを一緒にすると、それぞれが独自のビット オフセットで動作し、衝突することはありません。

FLAG_A | FLAG_C

翻訳先:

1 | 100

したがって、最終的にオンになります:

101

これは整数 5 を表します。

次に、設定されているさまざまなフラグに反応するコードは次のとおりです (ビットごとの を使用AND)。

$combined_flags = FLAG_A | FLAG_C;

if ( $combined_flags & FLAG_A ) {
  /// do something when FLAG_A is set
}

if ( $combined_flags & FLAG_B ) {
  /// this wont be reached with the current value of $combined_flags
}

if ( $combined_flags & FLAG_C ) {
  /// do something when FLAG_C is set
}

結局のところ、名前付き定数を使用することで読みやすくなり、通常は文字列や配列ではなく整数値に依存することでより最適になります。定数を使用するもう1つの利点は、使用時にタイプミスがあった場合、コンパイラーが警告を発して通知するのに適した状況にあることです...文字列値が使用されている場合、何かが間違っていることを知る方法がありません。

define('MY_FLAG_WITH_EASY_TYPO', 1);

my_function_that_expects_a_flag( MY_FLAG_WITH_EASY_TPYO );

/// if you have strict errors on the above will trigger an error

my_function_that_expects_a_flag( 'my_string_with_easy_tpyo' );

/// the above is just a string, the compiler knows nowt with 
/// regard to it's correctness, so instead you'd have to
/// code your own checks.
于 2012-12-11T01:12:54.733 に答える