3

インスタンスをテーブル行に出力するメソッドを持つ PHP クラスがあります。先頭に名前を付けずに行を印刷したい場合もあれば、すべての行項目を印刷したい場合もあります。

コードを読みやすくするためにビット フラグを使用することにしましたが、フラグの扱いがひどいようです。ビット フラグを使用するのはこれが初めてです。

クラスの先頭で次のようにフラグを定義しました。

define('BAT_TABLE_ROW_PLAYER', 1);
define('BAT_TABLE_ROW_NOPLAYER', 2);
define('BAT_TABLE_ROW_FIELD', 4);
define('BAT_TABLE_ROW_ALL', 7);

フラグを使用する関数は次のようになります。

function tableLine($flag=BAT_TABLE_ROW_ALL) {
    if(in_array($flag,[1,3,5,7]))
        // just return player cell
    if(in_array($flag,[2,3,6,7]))
        // return all other cells (except fielding)
    if(in_array($flag,[4,5,6,7]))
        // return fielding cells

    return $rtn;
}

ご覧のとおり、BAT_TABLE_ROW_ALLが設定されている場合、すべてのオプションが計画どおりに実行されます。

問題は、何らかの理由で別のフラグを追加する場合 (したがって、それを 8 に設定し、ALL を 15 に設定する - 現状では些細なことですが)、関数全体を書き直さなければならないことです。これは正しくありません。

上記の関数を記述するためのより良い方法はありますか?フラグ定義を更新してから、関数に追加のフラグ実行を追加するだけです?

4

2 に答える 2

7

ビット演算子

function tableLine($flag=BAT_TABLE_ROW_ALL) {
    if($flag & BAT_TABLE_ROW_PLAYER)
        // just return player cell
    if($flag & BAT_TABLE_ROW_NOPLAYER)
        // return all other cells (except fielding)
    if($flag & BAT_TABLE_ROW_FIELD)
        // return fielding cells

    return $rtn;
}

また、次のようにして、ALL常にフラグを立てる必要がないようにすることもできます。

define('BAT_TABLE_ROW_ALL', -1);

これは基本的に、すべてのビットが 1 に設定されているだけです。

于 2014-10-08T00:44:51.093 に答える
2

ビット単位の演算子を使用する必要があります

関数が何をしようとしているのかを正確に理解することは困難ですが、フラグに特定のビットが含まれているかどうかを確認するには、次のようにします。

if($flag & BAT_TABLE_ROW_FIELD) {
    // Flag contains the field bit...
}
于 2014-10-08T00:43:44.537 に答える