php 类常量可见性

Posted

技术标签:

【中文标题】php 类常量可见性【英文标题】:php class constant visibility 【发布时间】:2011-07-17 09:40:33 【问题描述】:

我们可以设置类常量的可见性吗? 对于这个例子:

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

【问题讨论】:

请注意,有一个针对 php 的 RFC 提出了类常量可见性,请参阅 PHP RFC: Support Class Constant Visibility。 不,此语言功能不存在(但)。它基本上是称为“具有访问级别的常量作为变量”的 Java 功能。您可以在“class const visibility”RFC(参见上面的评论)中找到有关此语言功能的更多信息,在此答案中:***.com/a/27762041/1163786 和拉取请求:github.com/php/php-src/pull/1494 【参考方案1】:

更新: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;

【讨论】:

OP,考虑选择这个作为正确的答案,因为来自@Alex 的答案从 PHP 7.1.0 起不再适用【参考方案2】:

从PHP7.1 开始,类常量允许使用可见性修饰符,在以前的版本中,无法设置类中常量的可见性。他们总是公开的。有关更多信息,请参阅http://www.php.net/manual/en/language.oop5.constants.php 的 cmets。

【讨论】:

我从评论中找到了这个.. 它帮助.. “以免有人认为这是 PHP 中的一个遗漏,拥有受保护或私有常量根本没有意义。访问说明符标识谁拥有更改成员的权利,而不是谁有权阅读它们” 我确实认为这是一个遗漏。它们不仅是访问修饰符,而且还限制了可见性。事实上,我不能为我的班级创建一个私有的常量,我认为这是一个问题。我会满足于多个修饰符,例如 private const $var = 'me';但这也是不允许的。【参考方案3】:

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

private static function gravitationalConstant() 
    return 9.81;

引用Fowler's Refactoring book:

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

【讨论】:

【参考方案4】:

在 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

【讨论】:

【参考方案5】:

php 中的常量不允许使用修饰符。 你可以使用

public static $variable = "abc";

但遗憾的是,这里不允许使用 final

【讨论】:

【参考方案6】:

现在可以在今天发布的Alpha PHP 7.1 中添加Class constant visibility modifiers

【讨论】:

【参考方案7】:

在 PHP 7.1.0 中是可能的。请访问PHP RFC: Support Class Constant Visibility

【讨论】:

以上是关于php 类常量可见性的主要内容,如果未能解决你的问题,请参考以下文章

PHP中默认类的可见性是啥?

特征可以具有具有私有和受保护可见性的属性和方法吗?特质可以有构造函数、析构函数和类常量吗?

php获取可见性

PHP 接口:指定任何可见性

类变量范围和可见性

Kotlin基础 常量变量可见性修饰符