2010-12-22 132 views
39

我正确地认为const属性是自动公开的吗?有没有办法让它们变得私密或保护?PHP类常量 - 公共,私有还是受保护的?

在此先感谢。

+6

是什么力量让它们隐藏起来的原因是什么?即使它们是公开的 - 它们是只读的。 – zerkms 2010-12-22 00:21:10

+2

常量是公开的,因为它们要描述关于类的不变事实,而不是状态或它。所以隐藏它们没有任何价值。 – StasM 2010-12-22 00:50:40

+0

可能会在`__getStatic`的未来版本中伪造它们。一般来说,如果您在脚本语言中完全需要访问修饰符,这是值得怀疑的。 (Javascript/Python是更加面向对象的方式,不需要它们。) – mario 2010-12-22 02:14:08

回答

33

是的,只要类本身已加载,它们就可以全局访问。据我所知,你不能修改PHP中的类常量的可访问性。

19

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

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

回想起当你学习对象设计时&分析......你给类方法和属性的最有限制的访问可能,然后根据需要放松它们(更难以回到另一种方式,因为其他类/代码开始使用它们,然后破坏其他代码)。

替代方法

最好的办法是只创建一个私有或受保护的变量和大写它来显示它是一个常数。你总是可以创建一个名为常量($ value_to_be_constant)的类来实现正确的魔术方法/ spl接口,以防止它被更改。

5

我知道这个问题是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; 
} 

其他信息

2

由于php7.1,你可以用访问修饰符publicprivate或定义你的类常量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

相关问题