Возможны ли частные константы в PHP?
PHP не разрешает
class Foo
{
private const my_private_const;
но, конечно, позволяет
const my_const;
Таким образом, константы являются глобальными, потому что я могу получить доступ к my_const
где угодно, используя Foo::my_const
Есть ли способ сделать частные константы?
Ответы
Ответ 1
Ответ прост: "нет". PHP не поддерживает эту концепцию. Лучшее, что вы можете сделать, это переменная private static
в классе, что, конечно, не так хорошо, потому что это не только для чтения. Но вам просто нужно обойти это.
Edit
Ваш вопрос заставил меня задуматься - вот что я никогда не пробовал, но мог бы работать. Иными словами, "это непроверено". Но скажите, что вам нужна "частная константа" под названием 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!';
Возможно, что-то стоит попробовать?
Приветствия
Ответ 2
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 …
Ответ 3
Обратите внимание, что модификаторы видимости для констант класса были добавлены в PHP 7.1.
RFC: Поддержка постоянной видимости класса сокетов
Ответ 4
Упрощенная версия обходного пути @Madbreaks: напишите приватную статическую функцию, которая возвращает значение вашей частной "константы":
private static function MY_CONSTANT() {
return "constant string";
}
Использование:
public static function DoStuff() {
echo self::MY_CONSTANT();
}
Ответ 5
Вы также можете использовать:
private static $foo;
или
protected static $bar;
И внутри класса вы можете позвонить.
Либо:
self::$foo
$this::$foo
CLASSNAME::$foo