PHP中的私有常量是否可行?

60 php const private

PHP不允许

class Foo
{
    private const my_private_const;
Run Code Online (Sandbox Code Playgroud)

但当然允许

const my_const;
Run Code Online (Sandbox Code Playgroud)

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

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

Tah*_*sin 89

伙计们!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;
?>
Run Code Online (Sandbox Code Playgroud)

在PHP 7.1中输出上述示例:

bar

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
Run Code Online (Sandbox Code Playgroud)

  • 应该是现在接受的答案 (4认同)

Mad*_*aks 41

答案很简单,"不".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;
}
Run Code Online (Sandbox Code Playgroud)

当然你的语法看起来有点奇怪:

// Retrieve the "constant"
$foo = $this->FOO;
Run Code Online (Sandbox Code Playgroud)

......但至少这不起作用:

$this->FOO = 'illegal!';
Run Code Online (Sandbox Code Playgroud)

也许值得一试的东西?

干杯


use*_*505 26

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

RFC:支持类常量可见性


ale*_*ird 7

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

private static function MY_CONSTANT() {
    return "constant string";
}
Run Code Online (Sandbox Code Playgroud)

用法:

public static function DoStuff() {
    echo self::MY_CONSTANT();
}
Run Code Online (Sandbox Code Playgroud)