2016-04-15 63 views
1
class foo { 
    const bar1 = 10.0; 
    const bar2 = 2.22; 
    const bar3 = 5.12; 

    function getTotal($some_string, $some_number) { 
     $total = 0.0; 
     // Why would this flag a warning? 
     // $what_is_const = constant("bar" . $some_string);   // DOES NOT WORK! 
     $what_is_const = constant(__CLASS__ . "::bar" . $some_string); // WORKS! 
     $total += $what_is_const * $some_number; 
    } 
} 

警告:常量():无法找到常量//具有完全相同的名称!__CLASS__ PHP。需要对此进行澄清。

问题是:为什么我需要识别类名来访问常量; 这是一个范围界定的问题吗?

+0

是的,它的[类常量](http://php.net/manual/en/language.oop5.constants.php)。 – drew010

+0

是的,但它为什么表现如此? – Valkyrurr

+0

因为你已经这样宣布。 –

回答

0

......这是一个范围界定问题吗?

你钉了它!
正如你已经定义了一个局部常量(内部类),它是一个class constant

为了通过self, static关键字来访问类的常量,你应该在前面加上一个类名(引用外类时),或者是这样的:

class Foo { 
    const BAR = 1; 

    function getBar() { return self::BAR; } 
} 
0

如果你有一类的常量外,它将在课堂外表现为一个常数。如果你在一个类中声明了一个常量,它几乎就像一个静态属性,并且可以以非常类似的方式访问(例如,类内的self::MY_CONSTANT或类外的Foo::MY_CONSTANT;与self::$staticPropertyFoo::$staticProperty相比较)。

这有助于找出哪些类用作依赖关系,以及常量是在哪里实际定义的。这一点,它通常允许常量更具可读性,因为它提供了与常数相关的上下文线索。

顺便说一下,使用下划线将常量全部大写(例如,MY_CONSTANT而不是myConstant)是很好的风格。此外,通常将类名称引用为上驼案(MyClass而不是myclass)。

+0

上下文线索,明白了! – Valkyrurr