PHP中可以使用私有常量吗? [复制]

Posted

技术标签:

【中文标题】PHP中可以使用私有常量吗? [复制]【英文标题】:Are private constants possible in PHP? [duplicate] 【发布时间】:2012-05-01 05:23:41 【问题描述】:

php 不允许

class Foo

    private const my_private_const;

当然允许

const my_const;

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

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

【问题讨论】:

如果它是一个常数值,它是否私有有关系吗? 你可以定义属于一个类php.net/manual/en/language.oop5.constants.php的类常量 @Hajo - 怎么样? private const 产生错误。 @Hajo:不正确。正如 TheAllFoo 提到的,可以使用 Class::CONSTANT 在任何地方引用常量。 现在可以在 PHP 7.1.0 (php.net/archive/2016.php#id2016-12-01-3) 【参考方案1】:

伙计们! PHP 7.1.0 has been released

现在可以使用带有类常量的可见性修饰符。

<?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 …

【讨论】:

现在应该是公认的答案【参考方案2】:

答案是简单的“不”。 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!';

也许值得一试?

干杯

【讨论】:

这是一个很棒的建议...我绝对会使用它!感谢分享。另一种选择是使所有变量成为私有和受保护的,然后创建一个像这样的函数来过滤哪些变量可以更改,哪些变量被强制为只读。看到我刚刚发布的这个! designersgate.com/blogs/?p=187 不幸的是,神奇的私有 getter 无法正常工作,因为 PHP 希望 __get 具有公共可见性。 基本上是“运行时定义的常量”的概念。实现是一个很酷的想法。我喜欢。并且$this-&gt;FOO 并不奇怪,如果 PHP 支持像 Java 这样的“常量作为变量” - 那么这将是对类常量的正确 OOP 访问。 我稍微修改了您的代码,将 final 添加到类并使用魔法集阻止了修改。见3v4l.org/UgEEm @Jens-AndréKoch 很高兴你喜欢。增加使用__set防止设置是一个很棒的功能,如果您愿意,请随时将其添加到答案中。【参考方案3】:

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

RFC:Support Class Constant Visibility

【讨论】:

【参考方案4】:

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

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

用法:

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

【讨论】:

以上是关于PHP中可以使用私有常量吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为什么PHP不允许私有const?

特征可以具有具有私有和受保护可见性的属性和方法吗?特质可以有构造函数、析构函数和类常量吗?

PHP 安全性:将连接详细信息存储在常量或私有属性中?

我可以将复制构造函数设为私有并仍然使用默认实现吗

导出的类中可以有私有成员吗? [复制]

可以隐藏私有方法吗? [复制]