【问题标题】:Assigning dynamic values with variables / constants in classes用类中的变量/常量分配动态值
【发布时间】:2010-12-06 18:52:49
【问题描述】:

我一直都知道您不能为类结构中的变量设置动态值,但是有什么办法可以解决这个问题吗?

我有这个界面:

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

但由于这是一个接口,因此没有方法,因此不允许使用代码块。

谁能提供解决方案?

【问题讨论】:

    标签: php class-structure dynamic-values


    【解决方案1】:

    您不能在类成员声明中使用这些运算符。但是,您可以简单地自己执行数学运算并分配结果。由于1 | 2 | 4 | 816 | 32 | 64 | 128 分别评估为15240,所以只需:

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

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

    【讨论】:

    • 抱歉,我的代码应该是 XOR,其计算结果为 11100110
    • 是的。我也意识到了这一点。无论哪种方式,只需自己计算价值并发表评论。
    • @RobertPitt - 我怀疑你的意思是 OR,而不是 XOR。但无论哪种方式,答案都是一样的:11110000(12 月 240 日)。 php中的XOR运算符是^,而OR运算符是|
    【解决方案2】:

    在其他语言中,这将起作用,因为编译器将识别仅包含常量文字的数学表达式,并将它们“减少”为单个常量文字值......因此,大多数“简单”的数学表达式都允许在实际代码不允许存在。

    然而,在 php 中,没有编译器(至少不是传统意义上的编译器)。 PHP 被解释。因此,我们习惯于在其他语言中拥有的许多“编译时”功能在 PHP 中根本不存在。

    这是其中一种情况。除非您想将常量移入类(而不是接口)并使其成为静态成员变量(而不是常量),否则您只能自己进行数学运算:

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

    不过,我怀疑你的意思是:

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

    【讨论】:

    • 是的,我的问题已经修改,谢谢你的回答,似乎最合乎逻辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2011-01-11
    • 2011-11-15
    • 2013-12-08
    • 2014-01-06
    相关资源
    最近更新 更多