Присвоение динамических значений переменным / константам в классах - PullRequest
1 голос
/ 06 декабря 2010

Я всегда знал, что вы не можете установить динамические значения для переменных в структуре класса, но есть ли способ обойти это?

У меня есть этот интерфейс:

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 ';'

Но поскольку это интерфейс, нет метода, для которого допускаются блоки кода.

Может кто-нибудь предложить решение?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

В других языках это будет работать, потому что компилятор распознает математические выражения, которые содержат только константные литералы, и «сводит» их к одному константному литеральному значению ... таким образом, большинство «простых» математических выражений допускаются в контекстах, где фактический код не может существовать.

Однако в php нет компилятора (по крайней мере, в традиционном смысле). PHP интерпретируется. Итак, многие функции «времени компиляции», которые мы привыкли иметь в других языках, просто не существуют в PHP.

Это один из таких случаев. Если вы не хотите переместить свои константы в класс (вместо интерфейса) и сделать их статическими переменными-членами (вместо констант), вы застряли, делая математические вычисления самостоятельно:

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

хотя, я подозреваю, что вы действительно имели в виду:

(16 | 32 | 64 | 128) == 240
2 голосов
/ 06 декабря 2010

Вы не можете использовать эти операторы в объявлениях членов класса.Тем не менее, вы можете просто выполнить математику самостоятельно и назначить результат.Поскольку 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
...