我一直都知道你不能在类结构中为变量设置动态值,但有什么方法吗?
我有这个界面:
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节和第1节的行。 2触发错误,更具体的错误如下:
syntax error, unexpected '|', expecting ',' or ';'
但是因为这是一个接口,所以没有方法可以禁止代码块。
有人能提供解决方案吗?
答案 0 :(得分: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
答案 1 :(得分:2)
在其他语言中,这将起作用,因为编译器将识别仅包含常量文字的数学表达式,并将它们“减少”为单个常量字面值...因此,大多数“简单”数学表达式在上下文中是允许的不允许存在实际代码。
然而,在php中,没有编译器(至少不是传统意义上的)。 PHP被解释。因此,我们习惯于在其他语言中使用的许多“编译时”功能在PHP中根本不存在。
这是其中一个案例。除非你想把你的常量移动到一个类(而不是一个接口)并使它们成为静态成员变量(而不是常量),否则你自己就会陷入困境:
(16 & 32 & 64 & 128) == 0
但是,我怀疑你的意思是:
(16 | 32 | 64 | 128) == 240