在 PHP 中是否可以使用私有常量


Are private constants possible in PHP?

PHP 不允许

class Foo
{
    private const my_private_const;

但当然允许

const my_const;

所以实际上常量是全局的,因为我可以使用Foo::my_const在任何地方访问my_const

有没有办法制作私有常量?

伙计们!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 不支持这个概念。 你能做的最好的事情就是类中的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!';

也许值得尝试的东西?

干杯

请注意,在 PHP 7.1 中添加了类常量的可见性修饰符。

RFC:支持类恒定可见性

@Madbreaks解决方法的简化版本:编写一个私有静态函数,返回私有"常量"的值:

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

用法:

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