1

クラス構造内の変数に動的な値を設定できないことを常に認識していますが、これを回避する方法はありますか?

私はこのインターフェースを持っています:

interface IUserPermissions
{
    /*
        * Public VIEW,CREATE,UPDATE,DELETE
    */
    const PUBLIC_VIEW   = 1;
    const PUBLIC_CREATE = 2;
    const PUBLIC_EDIT   = 4;
    const PUBLIC_DELETE = 8;
    const PUBLIC_GLOBAL = 1 | 2 | 4 | 8;          #Section 1

    /*
        * Admin  VIEW,CREATE,UPDATE,DELETE
    */
    const ADMIN_VIEW    = 16;
    const ADMIN_CREATE  = 32;
    const ADMIN_EDIT    = 64;
    const ADMIN_DELETE  = 128;
    const ADMIN_GLOBAL  = 16 | 32 | 64 | 128;     #Section 2
}

このコード内で、セクション1および2としてマークされた行がエラーをトリガーします。より具体的には、エラーは以下のとおりです。

syntax error, unexpected '|', expecting ',' or ';'

ただし、これはインターフェイスであるため、メソッドはありません。コードブロックは許可されていません。

誰かが解決策を提供できますか?

4

2 に答える 2

2

他の言語では、コンパイラが定数リテラルのみを含む数式を認識し、それらを単一の定数リテラル値に「縮小」するため、これは機能します...したがって、ほとんどの「単純な」数式は、実際のコードが存在することは許可されていません。

ただし、phpにはコンパイラがありません(少なくとも従来の意味では)。PHPは解釈されます。したがって、他の言語で使用されている多くの「コンパイル時」機能は、PHPには存在しません。

これはそのようなケースの1つです。定数を(インターフェイスではなく)クラスに移動し、(定数ではなく)静的メンバー変数にしたい場合を除いて、自分で計算を行うことに固執します。

(16 & 32 & 64 & 128) == 0

しかし、私はあなたが実際に意味したのではないかと思います:

(16 | 32 | 64 | 128) == 240
于 2010-12-06T19:10:34.320 に答える
2

これらの演算子をクラスメンバー宣言で使用することはできません。ただし、自分で計算を実行して結果を割り当てることができます。1 | 2 | 4 | 8とを16 | 32 | 64 | 128評価するので、それぞれ、15と評価し240ます。

const PUBLIC_GLOBAL = 15; // 1 | 2 | 4 | 8

const ADMIN_GLOBAL  = 240; // 16 | 32 | 64 | 128
于 2010-12-06T19:05:45.853 に答える