关于const:PHP类常量 – 公共,私有还是受保护?

PHP Class Constants - Public, Private or Protected?

假设常量属性是自动公开的,对吗?有没有办法让它们成为私有的或受保护的?

事先谢谢。


历史上,只要加载了类,并且没有办法更改它,类常量总是可以公开访问的。

从PHP7.1开始,默认情况下它们保持公共状态,但现在可以应用访问修饰符。以下是发行说明中的示例:

1
2
3
4
5
6
7
8
<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

类常量应该具有私有/受保护的选项,因为公共会公开类的内部细节,其他类/代码可能会误认为它们可以使用,因为它们是公共的。

很高兴知道更改私有常量只会影响它在其中定义的类。不幸的是,我们没有这个选择。

记得你学习对象设计和分析时的情景…您给类方法和属性尽可能多的限制性访问,然后根据需要放松它们(更难回到另一种方式,因为其他类/代码开始使用它们,这样会破坏其他代码)。

解决办法

最好的办法是只创建一个私有或受保护的变量,并用大写字母表示它是一个常量。您可以始终创建一个名为constant($value-to-be-constant)的类,该类实现正确的magic方法/spl接口,以防止更改它。


我知道这个问题已经6岁了

php 7.1(当前为rc1)允许指定类常量的可见性。

1
2
3
4
5
6
7
8
9
10
11
12
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;
}

附加信息

  • 类常量可见性上的RFC
  • 关于类常量可见性的博客文章

从php7.1开始,可以使用访问修饰符(publicprivateprotected定义类常量。请看下面的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class superheroes{
    public const kal_el = 'Superman';
    protected const bruce_wayne = 'Batman'; # works php7.1 onwards
   private const anthony_stark = 'Iron Man'; # works php7.1 onwards

    public static function show_remaining(){
        echo self::bruce_wayne, '<br />';
        echo self::anthony_stark, '<br />';
    }
}
echo superheroes::kal_el, '<br />';
superheroes::show_remaining();

学分:http://bellupper.io/post/48/defining-class-constants-in-php