2016-04-15 2 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; 
    } 
} 

Предупреждение: constant(): Не удалось найти константу // с таким же именем!__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::$staticProperty или Foo::$staticProperty).

Это помогает выяснить, какие классы используются в качестве зависимостей, и где константа фактически определена. Это, и это обычно позволяет константам быть более читаемыми, поскольку дает контекстные подсказки тому, с чем связана константа.

Как в стороне, это хороший стиль, чтобы константы были полностью прописными с подчеркиваниями (например, MY_CONSTANT вместо myConstant). Кроме того, имена классов обычно упоминаются как верхний корпус верблюда (MyClass вместо myclass).

+0

контекстные подсказки, понял! – Valkyrurr