Возможны ли частные константы в PHP?

PHP не позволяет

class Foo { private const my_private_const; 

но, конечно, позволяет

 const my_const; 

Таким образом, константы являются глобальными, потому что я могу получить доступ к my_const любом месте, используя Foo::my_const

Есть ли способ сделать частные константы?

Solutions Collecting From Web of "Возможны ли частные константы в PHP?"

Ответ прост: «нет». PHP не поддерживает эту концепцию. Лучшее, что вы можете сделать, это private static переменная в классе, что не так хорошо, потому что это не только для чтения. Но вам просто нужно обойти это.

редактировать

Ваш вопрос заставил меня задуматься – вот что я никогда не пробовал, но мог бы работать. Иными словами, «это непроверено». Но скажите, что вам нужна «частная константа» под названием FOO :

 // "Constant" definitions private function __get($constName){ // Null for non-defined "constants" $val = null; switch($constName){ case 'FOO': $val = 'MY CONSTANT UNCHANGEABLE VALUE'; break; case 'BAR': $val = 'MY OTHER CONSTANT VALUE'; break; } return $val; } 

Конечно, ваш синтаксис выглядел бы немного странно:

 // Retrieve the "constant" $foo = $this->FOO; 

… но по крайней мере это не сработало:

 $this->FOO = 'illegal!'; 

Может, что-то стоит попробовать?

ура

Folks! Выпущен PHP 7.1.0

Теперь можно иметь модификаторы видимости с константами класса.

 <?php class Foo { // As of PHP 7.1.0 public const BAR = 'bar'; private const BAZ = 'baz'; } echo Foo::BAR, PHP_EOL; echo Foo::BAZ, PHP_EOL; ?> 

Вывод приведенного выше примера в PHP 7.1:

 bar Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in … 

Обратите внимание, что модификаторы видимости для констант класса были добавлены в PHP 7.1.

RFC: постоянная видимость класса поддержки

Упрощенная версия обходного пути @Madbreaks: напишите частную статическую функцию, которая возвращает значение вашей частной «константы»:

 private static function MY_CONSTANT() { return "constant string"; } 

Применение:

 public static function DoStuff() { echo self::MY_CONSTANT(); } 

Вы также можете использовать:

 private static $foo; 

или

 protected static $bar; 

И внутри класса вы можете позвонить. Либо:

 self::$foo $this::$foo CLASSNAME::$foo