2010-12-06 6 views
1

Iv'a toujours été conscient que vous ne pouvez pas définir des valeurs dynamiques à des variables dans une structure de classe, mais est-il possible de contourner cela?Affectation de valeurs dynamiques avec des variables/constantes dans les classes

J'ai cette interface:

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 
} 

Dans ce code, les lignes marquées comme Section 1 & 2 déclencheur d'une erreur, plus spécifique, l'erreur est ci-dessous:

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

Mais comme c'est un interface il n'y a pas de méthode, il n'y a pas de blocs de code autorisés.

Quelqu'un peut-il offrir une solution?

Répondre

2

Vous ne pouvez pas utiliser ces opérateurs dans les déclarations de membre de classe. Cependant, vous pouvez simplement effectuer les calculs vous-même et affecter le résultat. Depuis 1 | 2 | 4 | 8 et 16 | 32 | 64 | 128 évaluer, respectivement, il suffit de faire à 15 et 240:

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

et

const ADMIN_GLOBAL = 240; // 16 | 32 | 64 | 128 
+0

Désolé, mon code était censé être XOR, qui évaluerait à '11100110' – RobertPitt

+0

Oui. J'ai réalisé cela aussi. De toute façon, il suffit de calculer la valeur vous-même et en faire un commentaire. – webbiedave

+0

@RobertPitt - Je suppose que vous vouliez dire OU, pas XOR. Mais de toute façon, la réponse est la même: '11110000' (240 dec). L'opérateur XOR dans php est '^', tandis que l'opérateur OR est '|'. – Lee

2

Dans d'autres langues, cela fonctionne parce que le compilateur reconnaît des expressions mathématiques qui ne contiennent que des littéraux constants, et "réduisez-les" à une seule valeur littérale constante ... ainsi, la plupart des expressions mathématiques "simples" sont permises dans des contextes où le code réel n'est pas autorisé à exister.

En PHP, cependant, il n'y a pas de compilateur (du moins pas dans le sens traditionnel). PHP est interprété. Ainsi, de nombreuses fonctionnalités de "compilation" que nous avons l'habitude d'utiliser dans d'autres langages n'existent tout simplement pas en PHP.

C'est l'un de ces cas. À moins que vous souhaitez déplacer vos constantes dans une classe (au lieu d'une interface) et les rendre variables membres statiques (au lieu des constantes), vous êtes coincé faire le calcul vous-même:

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

bien, je vous soupçonnez réellement signifié:

(16 | 32 | 64 | 128) == 240 
+0

oui ma question a été modifiée, merci pour votre réponse, semble le plus logique – RobertPitt

Questions connexes