Подтвердить что ты не робот

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

PHP не разрешает

class Foo
{
    private const my_private_const;

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

const my_const;

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

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

4b9b3361

Ответ 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 …

Ответ 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