我该如何在类中定义一个常量,并使其仅在类上下文中可见?
类似于 Foo::app()->MYCONSTANT;
(如果像 MYCONSTANT
这样调用,则被忽略)
请参阅类常量:
class MyClass
{
const MYCONSTANT = 'constant value';
function showConstant() {
echo self::MYCONSTANT. "\n";
}
}
echo MyClass::MYCONSTANT. "\n";
$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0
在这种情况下,将MYCONSTANT
单独输出会引发一个关于未定义常量的提示,并输出常量名称转换成的字符串:"MYCONSTANT"
。
编辑 - 也许您要寻找的是这个静态属性/变量:
class MyClass
{
private static $staticVariable = null;
public static function showStaticVariable($value = null)
{
if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
{
self::$staticVariable = $value;
}
return self::$staticVariable;
}
}
MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"
is_null(self::$staticVariable) === true) && (isset($value) === true)
еҸҜд»Ҙжӣҙз®ҖжҙҒең°иЎЁиҫҫдёәself::$staticVariable === null && $value !== null
гҖӮеҮҪж•°еҶ…йғЁе§Ӣз»ҲдјҡеҜ№$value
иҝӣиЎҢи®ҫзҪ®пјҢеӣ жӯӨдёҚйңҖиҰҒдҪҝз”Ёisset
гҖӮиҖҢи¶…жҳҺзЎ®зҡ„=== true
жІЎжңүд»»дҪ•ж„Ҹд№үгҖӮ - deceze这是一个老问题,但是现在在PHP 7.1中你可以定义常量的可见性。
例子
<?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 致命错误: 无法访问私有常量 Foo::BAZ in …
注意: 自 PHP 7.1.0 起,类常量允许使用可见性修饰符。
更多信息请在此处查看。
class Foo {
const BAR = 'baz';
}
echo Foo::BAR;
这是创建类常量的唯一方法。这些常量可以通过Foo::BAR
全局访问,但不能仅通过BAR
访问。
要实现像Foo::baz()->BAR
这样的语法,您需要从Foo
类的baz()
函数返回一个对象,该对象具有一个名为BAR
的属性。但那不是常量。您定义的任何常量都可以在任何地方全局访问,无法限制为函数调用结果。
这是一个相当老的问题,但也许这个答案仍然可以帮助其他人。
你可以通过将final关键字应用于返回预定义值的方法来模拟在类范围内受限制的公共常量,例如:
class Foo {
// This is a private constant
final public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
方法前的final关键字可以防止继承类重新定义该方法。 你还可以在类声明前加上final关键字,这样就可以防止类被继承。
要几乎完全得到Alex想要的结果,可以使用以下代码:
final class Constants {
public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
class Foo {
static public app()
{
return new Constants();
}
}
Foo::app()->MYCONSTANT();