たとえば、次のコードを考えてみましょう。
phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);
単一の引数が使用されていますが、単一のパイプ記号で区切られたオプションのリストを提供しています。
- 関数の引数値は正確に何が起こっているのですか?
- 同じことを自分の関数で使用できますか?
- そうですか、代わりに配列を渡すと言うよりも、これには利点がありますか?
たとえば、次のコードを考えてみましょう。
phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);
単一の引数が使用されていますが、単一のパイプ記号で区切られたオプションのリストを提供しています。
回答:
ビットごとの演算子は、関連する値のビットを変更します。ビット単位では、OR
基本的に、左引数と右引数の両方の各ビットを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.
複数のフラグのビットごとのORである引数を渡しています。演算子はどこでも使用できます。