PHP类常量可见性

28

我们能设置类常量的可见性吗?
就像这个例子:

class MyClass {
    const CONST_VALUE = 'A constant value';
}

我们能否指定

public const CONST_VALUE = 'A constant value';
或者
private const CONST_VALUE = 'A constant value';
或者
protected const CONST_VALUE = 'A constant value';

5
请注意,PHP有一份RFC提议引入类常量可见性,详见PHP RFC: Support Class Constant Visibility - Nic Wortel
不,这种语言特性目前还不存在。它基本上是Java中被称为“常量作为具有访问级别的变量”的特性。您可以在“class const visibility” RFC(请参见上面的评论)、此答案:http://stackoverflow.com/a/27762041/1163786以及Pull Request: https://github.com/php/php-src/pull/1494中找到更多关于此语言特性的信息。 - Jens A. Koch
7个回答

41

更新:PHP 7.1(于2016年12月1日发布)中添加了常量的可见性修饰符。请参见RFC:Support Class Constant Visibility

语法如下:

class ClassName {
    private const PRIVATE_CONST = 0;
    protected const PROTECTED_CONST = 0;
    public const PUBLIC_CONST = 0;
}

2
楼主,考虑选择这个作为正确答案,因为@Alex的回答在PHP 7.1.0中已经不再适用。 - thexpand

21

4
我从评论中找到了这篇文章,对我很有帮助。其中写到:“免得有人认为这是 PHP 的遗漏,实际上,将常量设置为 protected 或 private 是毫无意义的。访问修饰符标识谁有权更改成员,而不是谁有权读取它们。”我认为这是一个遗漏。访问修饰符不仅限制访问权限,而且限制可见性。目前来看,我无法创建一个私有常量,而这正是我所看到的问题。我可以将常量定义为类的私有变量,如:private const $var = 'me';但这也是不被允许的。 - Poonam Bhatt

4

另一种选择是使用常量方法,例如:

private static function gravitationalConstant() {
    return 9.81;
}

引用自Fowler的重构书

这个习惯用法对于基于C的程序员来说不太熟悉,但对于Smalltalkers来说非常熟悉(因为他们的语言中没有常量)。总的来说,我不倾向于在Java中使用它,因为它不符合该语言的习惯用法。然而,如果你需要用计算出的值替换简单的返回语句,那么将常量字段更改为常量方法是值得的。(我想应该有一个重构来解决这个问题....)


3

在 PHP 最新版本(PHP 7.1.0)中,它将可用。

示例语法如下:

class Token {
    // Constants default to public
    const PUBLIC_CONST = 0;

        // Constants then also can have a defined visibility
        private const PRIVATE_CONST = 0;
        protected const PROTECTED_CONST = 0;
        public const PUBLIC_CONST_TWO = 0;

        //Constants can only have one visibility declaration list
        private const FOO = 1, BAR = 2;
}

请参考下方链接。 https://wiki.php.net/rfc/class_const_visibility

0

在 PHP 中,常量不允许使用修饰符。 您可以使用

public static $variable = "abc";

但可悲的是,这里不允许使用 final


0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接