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->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中可以使用私有常量吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章