Правильно ли я полагаю, что свойства const автоматически публикуются? Есть ли способ сделать их частными или защищенными?
Спасибо заранее.
Правильно ли я полагаю, что свойства const автоматически публикуются? Есть ли способ сделать их частными или защищенными?
Спасибо заранее.
Исторически константы класса всегда были общедоступными, пока класс был загружен, и не было никакого способа изменить это.
Начиная с PHP 7.1, они остаются открытыми по умолчанию, но теперь могут применяться модификаторы доступа. Вот пример из заметок о выпуске:
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
Константы класса должны иметь возможность быть закрытыми/защищенными, потому что публикация предоставляет внутренние детали класса, которые другие классы/коды могут ошибочно использовать, думая, что они в порядке, потому что они являются общедоступными.
Было бы хорошо знать, что изменение частной константы будет ТОЛЬКО влиять на класс, в котором он определен. К сожалению, у нас нет этой опции.
Вспомните, когда вы изучали Object Design and Analysis... вы предоставляете методам и атрибутам класса наиболее доступный доступ к ресурсам, а затем расслабляете их по мере необходимости (гораздо сложнее вернуться в другую сторону, поскольку другие классы/код запускаются используя их, которые затем нарушали бы другой код).
РЕШЕНИЕ
Лучше всего просто создать приватную или защищенную переменную и в верхнем регистре, чтобы показать ее константу. Вы всегда можете создать класс с именем constant ($ value_to_be_constant), который реализует правильные интерфейсы magic methods/spl, чтобы предотвратить его изменение.
Я знаю, что этот вопрос 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;
}
Как и в 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