我如何在类内部定义一个常量,并使其使其仅在类上下文中被调用时才可见?
....就像是 Foo::app()->MYCONSTANT;
(如果被称为喜欢MYCONSTANT
被忽略)
Answers:
参见类常量:
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
不添加任何内容。
这是一个老问题,但是现在在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中的输出:
酒吧 致命错误:未捕获错误:无法在…中访问私有const Foo :: BAZ
注意: 自PHP 7.1.0起,类常量允许使用可见性修饰符。
更多信息在这里
这是一个很老的问题,但是也许这个答案仍然可以帮助其他人。
您可以通过将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();
您可以在php中定义一个类常量。但是您的类常量也可以从任何对象实例访问。这是php的功能。然而,由于php7.1,你可以定义你的类常量访问修饰符(public
,private
或protected
)。
解决方法是将常量定义为private
or protected
,然后通过使其可读static function
。如果从静态上下文中调用此函数,则仅应返回常量值。
您也可以在父类中创建此静态函数,并仅在所有其他类上继承此父类以使其成为默认功能。
鸣谢:http : //dwellupper.io/post/48/defining-class-constants-in-php