PHP не позволяет
class Foo { private const my_private_const;
но, конечно, позволяет
const my_const;
Таким образом, константы являются глобальными, потому что я могу получить доступ к my_const
любом месте, используя Foo::my_const
Есть ли способ сделать частные константы?
Ответ прост: «нет». 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