[解決済み] 関数の引数でシングルパイプ '|' を使用するとどうなりますか?
2023-06-08 09:06:16
質問
例えば、次のようなコードがあるとします。
phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);
引数は1つですが、オプションのリストを1つのパイプ記号で区切って提供しています。
- 関数内の引数値には、具体的に何が起こっているのでしょうか。
- 同じものを自分の関数で使うことはできますか?
- その場合、どのように、また、代わりに配列を渡すと言った場合よりも利点があるのでしょうか?
どのように解決するのですか?
ビット演算子
ビット演算子は、関係する値のビットを変更します。ビット演算子
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
}
結局のところ、定数に名前をつけることで読みやすくなり、文字列や配列ではなく整数値に依存することで一般的により最適化されるのです。定数を使用するもう一つの利点は、もし定数が誤って入力された場合、コンパイラはそれを判断し、警告を出すことができるということです...文字列値が使用された場合、何かが間違っていることを知る術がありません。
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.
関連
-
[解決済み】phpMyAdmin: シークレットパスフレーズ?
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み] Pythonの変数名や関数名の命名規則について教えてください。
-
[解決済み] PHPの文字列で、シングルクオートとダブルクオートの違いは何ですか?
-
[解決済み] 関数名をその関数内から判断する(トレースバックを使用しない)。
-
[解決済み] コンストラクタや関数に unique_ptr 引数を渡すにはどうしたらいいですか?
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
-
[解決済み】C言語の「static」関数とは?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
-
[解決済み] |=(シングルパイプイコール)、&=(シングルアンパサンドイコール)の意味するところ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】pdo - 非オブジェクトのメンバー関数prepare()への呼び出し【重複】。
-
[解決済み】未定義のメソッド mysqli_stmt::get_result を呼び出す。
-
[解決済み] [Solved] Fatal error: 非オブジェクトのメンバ関数fetch_assoc()の呼び出し [重複]。
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?