假设const属性是自动公开的,我是否正确?有没有办法让它们变得私密或受到保护?
提前致谢。
答案 0 :(得分:37)
从历史上看,只要加载了类并且没有办法改变它,类常量总是可以公开访问。
从PHP 7.1开始,默认情况下它们仍然是公开的access modifiers may now be applied。以下是发行说明中的示例:
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
答案 1 :(得分:18)
类常量应该具有私有/受保护的选项,因为公开暴露了类的内部细节,其他类/代码可能误以为它们可以使用,因为它们是公共的。
很高兴知道更改私有常量只会影响它定义的类。很遗憾,我们没有这个选项。
请记住,当您学习对象设计时分析...你给类方法和属性最可能的限制访问,然后根据需要放松它们(更难以回到另一个方向,因为其他类/代码开始使用它们然后会破坏其他代码)。
替代方法
最好的办法是创建一个私有或受保护的变量,并将其大写以显示它是一个常量。你总是可以创建一个名为constant($ value_to_be_constant)的类来实现正确的魔术方法/ spl接口,以防止它被改变。
答案 2 :(得分:7)
我知道这个问题是6岁
Php 7.1(目前为RC1)允许指定类常量的可见性。
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;
}
答案 3 :(得分:2)
从 php7.1 开始,您可以使用访问修饰符(public
,private
或protected
来定义类常量)。看看下面的例子:
<?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://dwellupper.io/post/48/defining-class-constants-in-php